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

时间:2011-05-09 20:21:44

标签: c# asp.net gridview .net-4.0

我正在向gridview的某些行(仅限一列)动态添加文本框。我用这个测试条件的insdie添加控件(工作正常):

        TextBox txtASIN = new TextBox();
        txtASIN.ID = "TxtASIN" + e.Row.RowIndex;
        e.Row.Cells[4].Controls.Add(txtASIN);
        int i = e.Row.Cells[4].Controls.Count; //TEST: This returns 1 correctly

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

    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        }

一旦我能够完成这项工作,我就可以遍历行并完成我需要对值进行的操作。我不知道在文本框中输入的文本是否在没有回发的情况下实际可读,但我不会感到难过。欢迎提出更好的建议。

感谢。

编辑:这是我现在的位置。我可以看到我的专栏中的文本框很好。我在试图阅读它们的按钮上放了一下,这就是我所看到的。如果我检查GridView2.Rows [0] .Controls.Count,我得到8,这是相关的列数。如果我检查GridVeiw2.Rows [0] .Cells [4] .Controls.Count,我得到0,这是错误的,因为文本框在那里。我动态创建后可以得到1的Count,但是当我执行后续的按钮点击时不能得到。

任何人都能解释一下吗?我觉得如果能够克服这种困难,我可以完成其余的工作。

再次感谢。

2 个答案:

答案 0 :(得分:2)

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

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

Add Textbox TemplateField Column To GridView Programmatically

答案 1 :(得分:1)

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