无法在gridview中找到嵌入式控件

时间:2018-05-15 07:51:28

标签: c# asp.net 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的文本框中更改了一些数据,我希望每当我单击“更新”按钮时都可以获取该数据。更新按钮位于gridview外部,作为普通的asp.net按钮。

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

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;
                    }
                }

我将文本数据视为null。请帮助如何获得这些价值观。另一方面,我希望gridview的整个数据作为数据集或数据表如何获得。

1 个答案:

答案 0 :(得分:0)

NamingContainerGridViewRow而非单元格,因此您应该使用:

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

如果这不能解决问题,那么在页面的生命周期中,您是以编程方式添加此TextBox吗?你知道你总是要在每次连续的回发中重新创建吗?在Page_Load中做最新的,更好Page_Init

如果您从RowDataBound添加,则必须在RowCreated中重新创建,否则保留ViewState为时已晚。