我有一个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的整个数据作为数据集或数据表如何获得。
答案 0 :(得分:0)
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
为时已晚。