현재 컨텍스트의 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의 데이터 행에서만 사용할 수 있습니다.