首页 > 解决方案 > 在gridview中找不到嵌入式控件

问题描述

我有一个gridview,在某些条件下,我在RowDataBound 中插入文本框:

 private void GetColumnWithValidation(GridViewRowEventArgs e, string columnName, int columnLength)
    {
        if (Convert.ToString(DataBinder.Eval(e.Row.DataItem, columnName)).Length > columnLength)
        {
            int colindex = GetColumnIndexByName(e.Row, columnName);
            TextBox txt = new TextBox();
            txt.Text = Convert.ToString(DataBinder.Eval(e.Row.DataItem, columnName));
            txt.BorderColor = Color.Red;
            txt.ID = "txt_" + i + "_" + colindex;
            lstErrorTracker.Add(i + "_" + colindex);
            //link.NavigateUrl = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "PV_INVOICE_LOCATION"));
            e.Row.Cells[GetColumnIndexByName(e.Row, columnName)].Controls.Add(txt);
        }
    }

现在,如果我在 gridview 的文本框中更改了一些数据,我希望每当我单击更新按钮时都能获取这些数据。更新按钮作为普通的 asp.net 按钮放置在 gridview 之外。

但是当我试图获取数据时,我得到了空值。

foreach (GridViewRow row in GVUploadDetails.Rows)
                {
                    if (row.RowType == DataControlRowType.DataRow)
                    {
                        TextBox txt= (row.Cells[3].FindControl("txt_0_3") as TextBox);
                        var test = txt.Text;
                    }
                }

我将文本数据设为空。请帮助如何获得这些值。另一方面,我希望 gridview 的整个数据作为数据集或数据表我怎么能得到它。

标签: c#asp.netgridview

解决方案


NamingContainer不是单元格GridViewRow,因此您应该使用:

foreach (GridViewRow row in GVUploadDetails.Rows)
{
    TextBox txt = row.FindControl("txt_0_3") as TextBox;
    // ...
}

如果这不能解决问题,您会在页面生命周期的哪个位置以TextBox编程方式添加它?您知道每次连续回发都必须重新创建它吗?做最新的Page_Load,更好的Page_Init

如果你添加它,RowDataBound你必须重新创建它RowCreated,否则为时已​​晚保留ViewState.


推荐阅读