현재 컨텍스트의 DataItemTemplate에서 ASPxComboBox에 액세스

Nov 13 2020

내 코드 숨김 파일 C #에서 내 콤보 상자에 액세스하려고하지만 현재 컨텍스트에 'cmbYearOfStudy'가 존재하지 않는다는 오류가 계속 발생합니다.

파일 => BulkScheduleAllocation.aspx.cs의 오류 이름을 제공하는 C # 코드입니다.

private void PopulateScheduleAcademicYearCombo()
    {
        for (var iYear = DateTime.Now.Year + 5; iYear >= 1999; iYear--)
        {
            var oItem = new ListEditItem(iYear.ToString(), iYear.ToString());
            cmbYearoOfStudy.Items.Add(oItem);
        }
        cmbYearOfStudy.DataBind();

        Utils.PopulateCombobox(ref cmbYearOfStudy, Request.QueryString["acyr"]);
    }

이것은 파일 => BulkScheduleAllocation.aspx의 aspx 코드 이름입니다.

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="BulkScheduleAllocation.aspx.cs" Inherits="Student_Popup_BulkScheduleAllocation" %>

                <dx:LayoutItem Width="40%" VerticalAlign="Top" RowSpan="3" ShowCaption="False" CaptionSettings-Location="Top" CaptionSettings-HorizontalAlign="Left" CssClass="labelfont">
                    <LayoutItemNestedControlCollection>
                        <dx:LayoutItemNestedControlContainer>
                             <dx:ASPxGridView ID="grvEnrollmentDetails" runat="server" KeyFieldName="ModuleEnrollmentId" SettingsPager-Mode="ShowAllRecords">
                                <Columns>
                                    <dx:GridViewDataColumn FieldName="Academicyear" VisibleIndex="0" Caption="Year" />
                                    <dx:GridViewDataColumn FieldName="ModuleName" VisibleIndex="1" Caption="Module Name" />
                                    <dx:GridViewDataColumn FieldName="ScheduleName" VisibleIndex="2" Caption="Schedule Name" />
                                    <dx:GridViewDataColumn FieldName="ScheduleGroupName" VisibleIndex="3" Caption="Group Name" />
                                    <dx:GridViewDataColumn FieldName="Result" VisibleIndex="4" Caption="Status" />
                                    <dx:GridViewDataColumn FieldName="Year" VisibleIndex="5" Caption="Status" >
                                            <DataItemTemplate>
                                                <dx:ASPxComboBox ID="cmbYearOfStudy" NullText="Please select" runat="server" Width="250" AutoPostBack="true" OnSelectedIndexChanged="cmbProposedQualification_SelectedIndexChanged"></dx:ASPxComboBox>
                                            </DataItemTemplate>
                                        </dx:GridViewDataColumn>
                                        <dx:GridViewDataColumn FieldName="Schedule" VisibleIndex="6" Caption="Accept">
                                            <DataItemTemplate>
                                                <dx:ASPxComboBox ID="cmbChangeSchedule" runat="server" DataSourceID="objStatuses" Enabled='<%# (((int)Eval("marker_id")==0 && (int)Eval("id")>0)?true:false) %>' ValueField="ID" TextField="Status_Name"></dx:ASPxComboBox>
                                            </DataItemTemplate>
                                        </dx:GridViewDataColumn>
                                </Columns>
                            </dx:ASPxGridView>
                        </dx:LayoutItemNestedControlContainer>
                    </LayoutItemNestedControlCollection>
                    <CaptionSettings HorizontalAlign="Left" Location="Top" />
                </dx:LayoutItem>

답변

1 Mikhail Nov 14 2020 at 17:18

'cmbYearOfStudy'컨트롤은 DataItemTemplate에 보관되며 각 행에 대해 생성되며 각각 액세스 할 수 있어야합니다. 사용할 수 초기화 /로드 이벤트 핸들러 사용하는 일반적인 기술을 직접 필요한 액세스 제어와 접근 방식 :

<dx:GridViewDataColumn ...>
    <DataItemTemplate>
        <dx:ASPxComboBox ID="cmbYearOfStudy" ... OnInit="cmbYearOfStudy_Init"></dx:ASPxComboBox>
    </DataItemTemplate>
</dx:GridViewDataColumn>

protected void cmbYearOfStudy_Init(object sender, EventArgs e) {
    ASPxComboBox cmbYearOfStudy = (ASPxComboBox)sender;

    for (var iYear = DateTime. Now.Year + 5; iYear >= 1999; iYear--) {
        var oItem = new ListEditItem(iYear.ToString(), iYear.ToString());
        cmbYearOfStudy.Items.Add(oItem);
    }
    //cmbYearOfStudy.DataBind(); //not required when adding .Items manually

    Utils.PopulateCombobox(ref cmbYearOfStudy, Request.QueryString["acyr"]);
}
vm Nov 13 2020 at 17:17

페이지에 grvEnrollmentDetails GridView가 있습니다. ComboBox cmbYearOfStudy는 머리글과 바닥 글을 제외한 테이블의 각 행에있는 GridView 내부에만 있습니다. 데이터를 ComboBox에 바인딩 할 수 있다면 테이블 행을 생성 할 때이를 수행해야합니다.

이제 코드가 약간 변경되었습니다.

aspx 코드 파일 BulkScheduleAllocation.aspx에서 :

<dx:ASPxGridView ID="grvEnrollmentDetails" runat="server" KeyFieldName="ModuleEnrollmentId" SettingsPager-Mode="ShowAllRecords" OnRowCreated="grvEnrollmentDetails_OnRowCreated">

코드 숨김 파일 BulkScheduleAllocation.aspx.cs에서 :

protected void grvEnrollmentDetails_OnRowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        ComboBox cmbYearoOfStudy = (ComboBox)e.Row.FindControl("cmbYearoOfStudy");
        for (var iYear = DateTime.Now.Year + 5; iYear >= 1999; iYear--)
        {
            var oItem = new ListEditItem(iYear.ToString(), iYear.ToString());
            cmbYearoOfStudy.Items.Add(oItem);
        }
    }
}

Combobox는 GridView의 데이터 행에서만 사용할 수 있습니다.