【问题标题】:Accessing dynamically generated dropdownlist in Gridview_RowUpdating event在 Gridview_RowUpdating 事件中访问动态生成的下拉列表
【发布时间】:2014-09-06 07:44:20
【问题描述】:

我正在使用带有 AutoGenerateColumns="True" 的 Gridview,因此 gridview 列是动态生成的。现在在编辑的情况下,我正在为 gridview 中的一个字段动态添加下拉列表。请看以下代码:

    protected void grdViewConfig_RowEditing(object sender, GridViewEditEventArgs e)
    {
        grdViewConfig.EditIndex = e.NewEditIndex;            
        BindGridView();

        clientBAL = new TMIWsBALClient();
        var lstAppIds = clientBAL.GetDistinctApplicationIds();

        GridViewRow grdRow = grdViewConfig.Rows[e.NewEditIndex];

        for (int i = 0; i < grdRow.Cells.Count; i++)
        {
            if (grdRow.Cells[i].GetType().Equals(typeof(DataControlFieldCell)))
            {
                DataControlFieldCell dcField = (DataControlFieldCell )grdRow.Cells[i];
                if (dcField.ContainingField.HeaderText.ToLower().Equals("applicationid"))
                {                        

                    DropDownList drpDwnAppIds = new DropDownList();
                    drpDwnAppIds.ID = "drpDwnAppIds";
                    drpDwnAppIds.DataSource = lstAppIds;                        
                    drpDwnAppIds.DataBind();

                    var tb = dcField.GetAllControlsOfType<TextBox>(); ;// grdRow.Cells[i].GetAllControlsOfType<TextBox>();
                    TextBox firstTb = (TextBox)tb.First();                        
                    foreach (ListItem lstItem in drpDwnAppIds.Items)
                    {
                        if (firstTb.Text.Equals(lstItem.Text, StringComparison.CurrentCultureIgnoreCase))
                        {
                            lstItem.Selected = true;
                        }
                    }

                    dcField.Controls.Remove(firstTb);
                    dcField.Controls.Add(drpDwnAppIds);
                }
            }               

        }            

    }

现在在 Gridview_RowUpdating 事件中,我试图以类似的方式获取下拉列表,但我无法获取它。 GetAllControlsOfType() 是一个扩展方法,它将返回所选父项下的所有子控件。在这种情况下,父控件是 gridview 单元格,子控件是下拉列表。但它返回 null。

    protected void grdViewConfig_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        strTableName = txtTable.Text.Trim();

        string strAppId;
        GridViewRow grdRow = grdViewConfig.Rows[grdViewConfig.EditIndex];

        for (int i = 0; i < grdRow.Cells.Count; i++)
        {
            if (grdRow.Cells[i].GetType().Equals(typeof(DataControlFieldCell)))
            {
                DataControlFieldCell dcField = (DataControlFieldCell)grdRow.Cells[i];
                if (dcField.ContainingField.HeaderText.ToLower().Equals("applicationid"))
                {
                    var drpDwn = dcField.GetAllControlsOfType<DropDownList>();
                    DropDownList drpDwnAppIds = (DropDownList)drpDwn.First();
                    strAppId = drpDwnAppIds.SelectedValue;
                }
            }

        }           

    }

我错过了什么?请帮忙。如果需要更多信息,请告诉我。

提前谢谢你。

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    需要在每次回发时重新创建动态生成的控件。在您的情况下,当您点击 grdViewConfig_RowUpdating 处理程序时,您创建的 DropDownList 控件不再存在。

    通常在这种情况下,您会将 AutoGenerateColumns 设置为 false 并手动定义列,这将允许您定义一个 TemplateField,其中包含一个用于只读模式的 ItemTemplate 和一个用于编辑模式的 EditItemTemplate,然后可以包含您的 DropDownList。

    【讨论】:

      猜你喜欢
      • 2014-12-10
      • 1970-01-01
      • 2015-09-07
      • 2023-03-14
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多