因为项目要求.需要把DataGrid里的一列模板列里的一个TextBox的ID在ItemDataBind这个事件里
给改一下.
   例如:设一个模版列里的TextBox的ID为Txt1,如果不改变他的ID,在页面上显示的ID为DataGrid1__Ctl2_Txt1.
   如果我用代码在ItemDataBind事件里把ID给改成28.在页面上就显示ID为DataGrid1__Ctl2_28...
   问题如下:
     把ID用代码动态改一下后.无论是利用FindControl方法也好.还是用Items[index].Cell[] as TextBox之类的代码.
     在后台怎么也得不到模版列里的文本框的内容了.
     请问,出来上述的办法有没有其他的办法能获取模版列中控件的值?
     要求:代码简短.不牵扯内存地址操作.

解决方案 »

  1.   

    馊主意,你判断一下这里有没有Request["DataGrid1__Ctl2_28"]
      

  2.   

    因为涉及页面提交后的处理,如果你对页面的处理并不理解的话,
    别改控件的ID,如果客户端需要用某个指定的文本框的ID,把ID输出到客户端的脚本
      

  3.   

    呵呵,果然把稀世达人acewang(龍芯*Inside!) 唤进来了!应该还是可以找到的吧:
    <asp:TemplateColumn>
         <ItemTemplate>
               <asp:LinkButton ID="LinkButton1" runat="server" CommandName="test">LinkButton</asp:LinkButton>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
           </ItemTemplate>
    </asp:TemplateColumn>
    ******************************
    protected void DataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)
        {
            if (e.Item.ItemIndex > -1)
            {
                TextBox txt = e.Item.FindControl("TextBox1") as TextBox;
                txt.ID = "123";
            }
        }
        protected void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e)
        {
            if (e.CommandName == "test")
            {
                TextBox txt = e.Item.FindControl("123") as TextBox;
                //TextBox txt = e.Item.Cells[0].Controls[3] as TextBox;
                txt.BackColor = System.Drawing.Color.Blue;
                Response.Write(txt.Text);
            }
        }
    不过上面是在vs2005下试的,明天再在vs2003里验证一下
      

  4.   

    ......
      我告诉你我为什么要改ID啊。  一个网格,现在就说只有2列。第一列是一个文本框,显示一个数据,第2列是一个按纽
    要求按纽一点就出现一个DIV块。里面有三个连接,分别是第一,第二,第三,点一下第一的话第一列跟他对应这一行的文本框的内容就得改成排序首位的,同类依次类推。
      另外还有一个LINKBUTTON,能实现让网格里的文本框的内容全部改成第一第二第三,当然这个每一行的前三名的数据是不同的。要求无刷新。
      能给个好点的不一塌糊涂的设计思路么??