只有BoundColumn列和自动生成列,才可以通过TableCell.Text属性读取显示的文本。HyperLinkColumn、ButtonColumn、EditCommandColumn都需要将目标控件转换成相应的控件。
比如:
假设DataGrid的第一列声明如下
<asp:HyperLinkColumn DataTextField="au_id" HeaderText="au_id" DataNavigateUrlField="au_id" DataNavigateUrlFormatString="Edit.aspx?id={0}"></asp:HyperLinkColumn>
读取的时候可以用:
//Items[0]表示第一行,Cells[0]表示第一列,Controls[0]表示Cell中的第一个控件(也只有这个控件可以用)
HyperLink link = (HyperLink)DataGrid1.Items[0].Cells[0].Controls[0]);
Response.Write(link.Text);
至于模板列(TemplateColumn),当然也可以通过DataGrid1.Items[i].Cells[j].Controls[n]来获取,然后转换成原来的控件类型再操作,但是还有个更好的办法,就是用FindControl来查找控件。
FindControl是System.Web.UI.Control的方法,可以根据子控件ID来查找子控件
比如:
假设DataGrid的某一列声明如下
<asp:TemplateColumn>
   <ItemTemplate>
      <asp:TextBox Runat="server" ID="txtID" Text='<%# DataBinder.Eval(Container.DataItem,"au_id") %>'>
      </asp:TextBox>
   </ItemTemplate>
</asp:TemplateColumn>
读取方法:
TextBox txt = (TextBox)DataGrid1.Items[1].FindControl("txtID");
Response.Write(txt.Text);
外面读
CheckBox pch=(CheckBox)this.DataGrid1.Items[j].Cells[0].FindControl("pch");

解决方案 »

  1.   

    其他的事件中也可以取到DataGrid中的值,关键是要发生在DataGird被绑定之后
      

  2.   

    TextBox tb=(TextBox)MyDataGrid.Items[0].Cells[0].FindControl("tb");//
      

  3.   

    同意楼上。出现这样错误,因为你没有弄清楚Item是指行,Cells是指列,而你的TextBox是放在一个指定的单元格内,也就是要指定他的行和列。所以你不要忘了加上Cells[]
      

  4.   

    可能是因为你点了按钮后,对datagrid进行了重新邦定,里面相应的栏位没有了数据,才出现了你看到的错误。
      

  5.   

    int i=1;
    int j=1;
    //可以用循环   ,具体使用请参考 DataGridItem 的使用
    System.Web.UI.WebControls.DataGridItem item =this.DataGrid1.Items[i]
    item.Cells[j]="";
      

  6.   

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim t As TextBox = New TextBox()
            Dim i As Integer
            For i = 0 To DataGrid1.Items.Count - 1
                t = DataGrid1.Items(i).FindControl("textbox1")
                Response.Write(t.Text)
            Next
        End Sub
      

  7.   

    还是不行,谁有源码,能给我发一份吗???
    [email protected]