我有问题,我无法获得我在DataGrid中添加的控件。我在OnRowDataBound事件中添加它,如:
protected void RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowState == DataControlRowState.Edit || e.Row.RowState == (DataControlRowState.Alternate | DataControlRowState.Edit))
{
//int cindex = 0;
//for (cindex = 0; cindex < e.Row.Controls.Count; cindex++)
foreach (Control ctl in e.Row.Controls)
{
DataControlFieldCell dcctl = (DataControlFieldCell)ctl;
TableCell tcell = (TableCell)dcctl;
Label lblComment = new Label();
TextBox txtComment = new TextBox();
lblComment.Text = "<br>Comment: ";
dcctl.Controls.Add(lblComment);
dcctl.Controls.Add(txtComment);
//tcell.Controls.Add(lblComment);
//tcell.Controls.Add(txtComment);
//e.Row.Cells[cindex].Controls.Add(lblComment);
//e.Row.Cells[cindex].Controls.Add(txtComment);
这里发生了什么:默认情况下TableCell中已经存在一个TextBox,我想添加另一个TextBox和Label。在绑定之后我可以看到2个文本框,我可以将数据输入到两者中,但是当我单击“更新”按钮时,然后引发OnRowUpdating
事件,我无法获取我的TextBox!
protected void RowUpdating(object sender, GridViewUpdateEventArgs e)
{
grdView.EditIndex = -1;
int counter = 0;
for (counter = 0; counter < grdView.Rows[e.RowIndex].Cells.Count; counter++)
{
foreach (Control ctl in grdView.Rows[e.RowIndex].Cells[counter].Controls)
{
在这里,我将只获得默认的一个TextBox(带有它的值)。但我的TextBox消失了! :(
你能在这里建议我做什么?
P.S。我不能在aspx文件中使用预定义列,例如asp:TemplateField
,因为我的表每次都有不同的行数。这是动态的
答案 0 :(得分:0)
问题在于,在向页面(或任何页面的子控件,如数据网格)动态添加控件之后,必须在回发时重新创建服务器端的控件。如果你没有在服务器端重新创建控件,那么当运行时处理回发时,它将不知道在何处放置表单的内容。
所以基本上当页面处理回发时,它会看到一个名为“gridView1_txtComment”的HTML字段(实际的HTML id可能是别的,我知道)。但是服务器端代码模型只有一个gridView1实例,没有一个名为txtComment 的TextBox实例,除非你再次运行RowDataBound
方法 创造那种控制。
答案 1 :(得分:0)
我认为它与ViewState有关。从中创建一个模板化列,然后将第二个文本框添加到模板中。
答案 2 :(得分:0)
我做到了!
拒绝在OnRowDataBound中动态添加控件,并创建了动态的TempalteField列,这些列包含了2个TextBoxes和Label。 (借助http://www.codeproject.com/KB/aspnet/create_template_columns.aspx)
但是在我的问题返回之后..在OnRowUpdating事件上仍然没有我添加的TextBoxes。最后我在这里发现了http://forums.asp.net/p/1537632/3738331.aspx,需要在Page_Load上实现TempalteField-s,这有助于我解决问题!