Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Gridview中读取动态创建的文本框_C#_Asp.net_Gridview_.net 4.0 - Fatal编程技术网

C# 在Gridview中读取动态创建的文本框

C# 在Gridview中读取动态创建的文本框,c#,asp.net,gridview,.net-4.0,C#,Asp.net,Gridview,.net 4.0,我动态地向gridview的某些行(仅一列)添加一个文本框。我添加了带有此测试条件的控件(工作正常): 我希望用户能够在一个或多个文本框中输入值,然后通过单击一个按钮(而不是每行单击一次)更新数据库。我遇到的问题是如何在按钮单击事件中访问这些值。我用这种方法做了一个简单的测试,试图查看第二行中的值,但在temp1中得到null(我确信在该文本框中输入了一个值): 一旦我能做到这一点,我就可以遍历这些行,并对这些值执行我需要执行的操作。我不知道在文本框中输入的文本在没有回发的情况下是否真的可读,但

我动态地向gridview的某些行(仅一列)添加一个文本框。我添加了带有此测试条件的控件(工作正常):

我希望用户能够在一个或多个文本框中输入值,然后通过单击一个按钮(而不是每行单击一次)更新数据库。我遇到的问题是如何在按钮单击事件中访问这些值。我用这种方法做了一个简单的测试,试图查看第二行中的值,但在temp1中得到null(我确信在该文本框中输入了一个值):

一旦我能做到这一点,我就可以遍历这些行,并对这些值执行我需要执行的操作。我不知道在文本框中输入的文本在没有回发的情况下是否真的可读,但在其他方面我感到困惑。欢迎就如何做到这一点提出更好的建议

谢谢

编辑:这就是我现在的位置。我可以很好地看到我专栏中的文本框。我在一个试图阅读它们的按钮上插入了一个按钮,这就是我看到的。如果我选中GridView2.Rows[0].Controls.Count,我会得到8,这是正确的列数。如果我选中GridVeiw2.Rows[0].Cells[4].Controls.Count,则得到0,这是错误的,因为文本框在那里。我可以在动态创建后立即获得1的计数,但在执行后续的按钮单击时不会

有人能解释一下吗?我觉得如果我能克服这一阻碍,我就能完成剩下的事情


再次感谢。

您需要为TextBox控件分配一个ID,然后在FindControl()中通过该ID访问它们。另外,请确保您正在页面生命周期的Init()方法中添加控件。这样就可以将其添加到ViewState

TextBox txt1 = new TextBox();
txt1.ID = "txt1"; 
e.Row.Cells[4].Controls.Add(txt1);
编辑:我刚刚想起另一个可能的解决方案。在GridView中创建一个TemplateField,而不是通过编程在代码隐藏中创建TextBox控件


我会尝试另一种方法,将文本框放在页面的html标记中,然后在ItemDataBound事件中控制它的visible或readonly属性。这样,控件将始终存在,您不必担心生命周期的问题。

非常有意义,但仍然没有改变结果。(必须运行一段时间,但会尽快检查)好的,添加了一些您可能需要的其他内容,这取决于您执行代码实例化TextBox控件的位置。不确定您添加了什么。是关于在Init()方法中添加控件的注释吗?我将它们添加到gridview的RowDataBound方法中。这是一个问题吗?@nycdan是的,这是一个建议,但可能不可行,因为看起来您依赖的网格是数据绑定的,而此时它还没有绑定(Init())。您还可以在Request.Form集合中的回发上获取文本框值。这与Decker所说的将文本框放入html中类似吗?请注意,您必须在每次回发上重新创建控件。ASP.NET不会为您记住它。ASP.NET 4.0应用程序可以像WinForms、WPF或Silverlight一样轻松地成为ASP.NET。您使用的标记不够具体。抱歉,Roman…没有按照这些思路思考。当我不显示文本框时,是因为我想在该单元格中显示一个值。这会使这种方法无效吗?或者它可以双向工作吗?它应该仍然有效,但是如果您希望同时显示值和文本框呢?注意格式。不需要同时显示这两种格式。我要么显示值,要么如果没有,我显示文本框。我会试试这个……谢谢。
    protected void btnUpdate1_Click(object sender, EventArgs e)
    {
        TextBox temp = (TextBox)GridView2.Rows[1].FindControl("txt1");
        string temp1 = temp.Text;
        int i = GridView2.Row.Cells[4].Controls.Count; //TEST: This returns 0 incorrectly        }
TextBox txt1 = new TextBox();
txt1.ID = "txt1"; 
e.Row.Cells[4].Controls.Add(txt1);