【问题标题】:How can I retrieve values from a DropDownList dynamically added to a GridView in the RowUpdating event?如何从在 RowUpdating 事件中动态添加到 GridView 的 DropDownList 中检索值?
【发布时间】:2013-10-23 00:00:25
【问题描述】:

我对 ASP.NET 非常陌生,而且总体上是真正的编程。我有一个 GridView,我在 RowDataBound 事件中的编辑时添加了一个 DropDownList。现有控件是只读的,似乎不会在编辑时显示。

protected void GridViewVehicles_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.RowType == DataControlRowType.DataRow)
     {
         if (e.Row.RowState == DataControlRowState.Edit) 
         {
             DropDownList ddlVehicles = GetVehicles();
             string make = e.Row.Cells[9].Text;
             ddlVehicles.Items.FindByText(reportsTo).Selected = true;
             e.Row.Cells[10].Controls.Add(ddlVehicles);
         }
     }
}      

问题是我似乎无法访问 RowUpdating 事件中 DropDownList 的选定值。该表格单元格的控件计数似乎为 0。以下抛出和参数超出范围异常。

protected void GridViewEmployees_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string vehicle = ((DropDownList)(row.Cells[10].Controls[0])).SelectedValue;
}

在 Chrome 调试器中,我确实看到发布了正确的值,但我就是不知道如何访问它。

我读到有可能对 DropDownList 使用 OnSelectedIndexChanged 事件并将值存储在 ViewState 中,但我也遇到了困难。

任何关于如何最好地进行的指导将不胜感激。提前致谢!

【问题讨论】:

标签: c# asp.net gridview


【解决方案1】:

看起来GetVehicles() 方法正在动态创建下拉列表,因为您在第二个 if 语句的最后一行将下拉列表添加到 Controls 集合中。

当您动态创建控件时,您必须在每次回发时重新创建它们。

相反,将下拉控件放在EditItemTemplate 中,然后使用FindControl 方法找到该控件,并像现在一样在后面的代码中填充它。

这里是GridView定义的例子:

<asp:GridView runat="server" ID="GridViewVehicles" OnRowDataBound="GridViewVehicles_RowDataBound" OnRowUpdating="GridViewVehicles_RowUpdating">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <!-- Text of selected drop-down item -->    
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList runat="server" ID="ddlVehicles" />
                </EditItemTemplate>
            </asp:TemplateField>

        </Columns>
    </asp:GridView>

还有代码隐藏:

protected void GridViewVehicles_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowState == DataControlRowState.Edit)
            {
                //Get the drop-down datasource and perform databinding
            }
        }

        protected void GridViewVehicles_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            DropDownList ddlVehicles = GridViewVehicles.Rows[e.RowIndex].FindControl("ddlVehicles") as DropDownList;

            if (ddlVehicles != null)
            {
                string selectedValue = ddlVehicles.SelectedValue;
            }
        }

希望对你有帮助!

问候,

乌罗什

【讨论】:

  • 谢谢!我认为这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多