c# - 在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 的整个数据作为数据集或数据表我怎么能得到它。
解决方案
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
.
推荐阅读
- html - 我无法将页脚向右对齐
- python-3.x - 使用pyqt5将html转换为pdf而不显示屏幕
- python - 使用元组初始化 NumPy 数组(填充相同的元组)
- django - 在负载均衡器后面配置 nginx/gunicorn django
- microsoft-graph-api - Microsoft Graph 代表令牌 - 只能使用一次吗?
- c - printf("%d\n",scanf("%d",&i)) 的输出是什么?
- c++ - C++ 跟踪线程完成
- arrays - 为什么空数组的类型在结构内部和外部具有不同的大小?
- c++ - 包含 QNetwork 模块
- google-api - 文件以字符串形式返回