我正在向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,但是当我执行后续的按钮点击时不能得到。任何人都能解释一下吗?我觉得如果能够克服这种困难,我可以完成其余的工作。
再次感谢。
答案 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属性。这样,控件将始终存在,您不必担心生命周期的东西。