RowDataBound-Event 中的 FindControl 以错误结束
FindControl in RowDataBound-Event ends in error
我的 GridView
中的 TemplateField
是这样创建的:
<asp:TemplateField HeaderText="Dienstleistung" SortExpression="gutscheinbezeichnung" HeaderStyle-Width="20px">
<EditItemTemplate>
<asp:HiddenField runat="server" Value='<%# Bind("gutscheinart_id")%>' ID="HiddenFieldGutscheinartID"/>
<asp:DropDownList ID="DropDownListDienstleistung" ClientIDMode="Static" runat="server" DataSourceID="ObjectDataSourceDropDown" DataValueField="gutscheinbezeichnung">
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSourceDropDown" runat="server" SelectMethod="GetGutscheinArt" TypeName="Gmos.Halbtax.Admin.Client.WebGui.DataManager"></asp:ObjectDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LabelGutscheinbezeichnung" runat="server" Text='<%# Bind("gutscheinbezeichnung") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Width="20px" />
</asp:TemplateField>
如您所见,我的 EditItemTemplate
-Field 中有一个名为 DropDownListDienstleitung
的 DropDownList
。
我也创建了这个活动:
protected void GridViewLehrling_RowDataBound(object sender, GridViewRowEventArgs e)
{
DropDownList DropDownListDienstleistungBackEnd = (DropDownList)GridViewLehrling.Rows[GridViewLehrling.SelectedIndex].FindControl("DropDownListDienstleistung");
HiddenField HiddenFieldGutscheinartIDBackEnd = (HiddenField)GridViewLehrling.Rows[GridViewLehrling.EditIndex].FindControl("HiddenFieldGutscheinartID");
}
现在,如果此事件触发。发生此错误:
Index was out of range. Must be non-negative and less than the size of
the collection. Parameter name: index
有什么建议吗?
您无法在页眉中找到下拉控件,因此您需要检查当前行 datarow
与否
试试这个。
protected void GridViewLehrling_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (GridViewLehrling.Rows.Count > 0)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DropDownList DropDownListDienstleistungBackEnd = (DropDownList)GridViewLehrling.Rows[GridViewLehrling.SelectedIndex].FindControl("DropDownListDienstleistung");
HiddenField HiddenFieldGutscheinartIDBackEnd = (HiddenField)GridViewLehrling.Rows[GridViewLehrling.EditIndex].FindControl("HiddenFieldGutscheinartID");
}
}
}
尝试使用以下代码:
protected void GridViewLehrling_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.RowState == DataControlRowState.Edit)
{
DropDownList ddlBackEnd = (DropDownList)e.Row.FindControl("DropDownListDienstleistung");
HiddenField hdnBackEnd = (HiddenField)e.Row.FindControl("HiddenFieldGutscheinartID");
}
}
}
代码首先检查行的 type。它必须是 DataRow
以便排除页脚和 header 行。然后代码检查该行是否实际上处于编辑模式。如果是这种情况,则代码会获取控件,在实际行上执行 FindControl
。
我的 GridView
中的 TemplateField
是这样创建的:
<asp:TemplateField HeaderText="Dienstleistung" SortExpression="gutscheinbezeichnung" HeaderStyle-Width="20px">
<EditItemTemplate>
<asp:HiddenField runat="server" Value='<%# Bind("gutscheinart_id")%>' ID="HiddenFieldGutscheinartID"/>
<asp:DropDownList ID="DropDownListDienstleistung" ClientIDMode="Static" runat="server" DataSourceID="ObjectDataSourceDropDown" DataValueField="gutscheinbezeichnung">
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSourceDropDown" runat="server" SelectMethod="GetGutscheinArt" TypeName="Gmos.Halbtax.Admin.Client.WebGui.DataManager"></asp:ObjectDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LabelGutscheinbezeichnung" runat="server" Text='<%# Bind("gutscheinbezeichnung") %>'></asp:Label>
</ItemTemplate>
<HeaderStyle Width="20px" />
</asp:TemplateField>
如您所见,我的 EditItemTemplate
-Field 中有一个名为 DropDownListDienstleitung
的 DropDownList
。
我也创建了这个活动:
protected void GridViewLehrling_RowDataBound(object sender, GridViewRowEventArgs e)
{
DropDownList DropDownListDienstleistungBackEnd = (DropDownList)GridViewLehrling.Rows[GridViewLehrling.SelectedIndex].FindControl("DropDownListDienstleistung");
HiddenField HiddenFieldGutscheinartIDBackEnd = (HiddenField)GridViewLehrling.Rows[GridViewLehrling.EditIndex].FindControl("HiddenFieldGutscheinartID");
}
现在,如果此事件触发。发生此错误:
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
有什么建议吗?
您无法在页眉中找到下拉控件,因此您需要检查当前行 datarow
与否
试试这个。
protected void GridViewLehrling_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (GridViewLehrling.Rows.Count > 0)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DropDownList DropDownListDienstleistungBackEnd = (DropDownList)GridViewLehrling.Rows[GridViewLehrling.SelectedIndex].FindControl("DropDownListDienstleistung");
HiddenField HiddenFieldGutscheinartIDBackEnd = (HiddenField)GridViewLehrling.Rows[GridViewLehrling.EditIndex].FindControl("HiddenFieldGutscheinartID");
}
}
}
尝试使用以下代码:
protected void GridViewLehrling_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.RowState == DataControlRowState.Edit)
{
DropDownList ddlBackEnd = (DropDownList)e.Row.FindControl("DropDownListDienstleistung");
HiddenField hdnBackEnd = (HiddenField)e.Row.FindControl("HiddenFieldGutscheinartID");
}
}
}
代码首先检查行的 type。它必须是 DataRow
以便排除页脚和 header 行。然后代码检查该行是否实际上处于编辑模式。如果是这种情况,则代码会获取控件,在实际行上执行 FindControl
。