DataGrid(主) 中做了一个模板列,模板列中设置了一个DataGrid (子),如何判断选择了 DataGrid(子)中的那一行?急!

解决方案 »

  1.   

    --最主要是就是找到这个子grid,其它与正常的一样
    foreach(DataGridItem di in datagrid.items)
    {
         DataGrid dg=di.findControl("subgridname");
         ....(对子datagrid处理)
         
         
    }
      

  2.   

    先获取DataGrid(主)的行号,列号,再用foreach 获取 DataGrid(子)的控件,根据控件的id 号,判断DataGrid(子)所在行把
      

  3.   

    huangkc(糊涂虫) 你的方法放在 主DataGrid 的 ItemCommand 事件中执行吗?
      

  4.   

    同二楼一样的
    DataGrid dg = e.Item.FindControl("DataGrid2");
    foreach(DataGridItem de in dg.Items)
    {
      //操作
    }
      

  5.   

    先获取DataGrid(主)的行号,列号,再用foreach 获取 DataGrid(子)的控件,根据控件的id 号,判断DataGrid(子)所在行把
    ------------
    能有具体的代码吗?
    如何去的DataGrid主的行、列呢?
      

  6.   

    huangkc(糊涂虫) 你的方法放在 主DataGrid 的 ItemCommand 事件中执行吗?
      

  7.   

    DataGrid DataGrid1 = e.Item.FindControl("DataGrid2");
    foreach(DataGridItem de in DataGrid1.Items)
    {
      ...
    }
      

  8.   

    D:\Inetpub\wwwroot\ZY_Net1\WebFrm_chkdoc_edit.aspx.cs(459): 无法将类型“System.Web.UI.Control”隐式转换为“System.Web.UI.WebControls.DataGrid”
    -------------------private void grid_m_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {

    DataGrid dg = e.Item.FindControl("grid_d");
    }报错了
      

  9.   

    private void grid_m_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
      Label zbhjlb =(Label)(e.Item.FindControl("Label4"));
      //FindControl查找放置在模板列得控件。..
    }
      

  10.   

    呵呵﹐肯定還要顯式轉換一下咯﹐從第二樓就看到這個問題﹐后面還跟了几樓照抄的﹐我心里就納悶呢﹐咋行呢﹖果然。。呵呵。。DataGrid dg = (DataGrid)e.Item.FindControl("grid_d");
      

  11.   

    就是,楼上正解要这样DataGrid dg = (DataGrid)e.Item.FindControl("grid_d");
      

  12.   

    谢谢上面几位DataGrid dg = (DataGrid)e.Item.FindControl("grid_d");
    这样是不报错的,
    可是,我如何知道点击的是 grid_d 的那一行呢?急呀
      

  13.   

    foreach(DataGridItem di in datagrid.items)
    {
         DataGrid dg=di.findControl("subgridname");
         ....(对子datagrid处理)
         
         
    }
    一个两层的循环就可以达到你的效果的
      

  14.   

    什么意思啊?莫非你的子DataGrid还有按钮可点?
      

  15.   

    DataGrid dg = (DataGrid)e.Item.FindControl("grid_d");
    这样是不报错的,
    可是,我如何知道点击的是 grid_d 的那一行呢?
      

  16.   

    什么意思啊?莫非你的子DataGrid还有按钮可点?
    ----------------是的,老大,否则我如何知道选择的是那一行呢?
      

  17.   

    private void grid_m_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
       DataGrid dg = (DataGrid)e.Item.FindControl("grid_d");
       LinkButton lb1 = (LinkButton)dg.FindControl("rbsel");
       tb_chk_note.Text = lb1.Text;
    }
    -------------
    我的代码是这样的,不报错,但是也得不到我想要的,急!
      

  18.   

    首先你的子DataGrid要类似这样
    <asp:DataGrid ID=grid_d Runat=server OnItemCommand="grid_d_ItemCommand"
    AutoGenerateColumns=False>
    <Columns>
       <asp:BoundColumn DataField="a" HeaderText="a"></asp:BoundColumn>
       <asp:TemplateColumn HeaderText="test">
    <ItemTemplate>
    <asp:LinkButton ID=link1 Runat=server CommandName=link1 Text=showme></asp:LinkButton>
    </ItemTemplate>
    </asp:TemplateColumn>
            </Columns></asp:DataGrid>
    后台:
    protected void grid_d_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    if(e.CommandName == "showme")
    {
       string id = e.Item.Cells[0].Text;//这里获取你点击行的第一列的值
    }
    }
    明白吗?
      

  19.   

    错了后台应该这样
    后台:
    protected void grid_d_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    if(e.CommandName == "link1")
    {
       string id = e.Item.Cells[0].Text;//这里获取你点击行的第一列的值
    }
    }
      

  20.   

    谢谢 stoneallen(我不想说,我很亲切) 
    -------------------------------------
    protected void grid_d_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    if(e.CommandName == "link1")
    {
       string id = e.Item.Cells[0].Text;//这里获取你点击行的第一列的值
    }
    }
    -----------------关键是 grid_m 是主,grid_d 是子,grid_d 是在 grid_m模板列中做的,我都找不到,grid_d_ItemCommand 这个事件的声明,以及写事件代码的地方呀
      

  21.   

    因为rbsel属于grid_d,所以
    private void grid_m_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
      DataGrid dg = (DataGrid)e.Item.FindControl("grid_d");
     //思路大体如此吧
      foreach(DataGridItem di in dg.Items)
      {
       LinkButton lb1 = (LinkButton)dg.FindControl("rbsel");
       tb_chk_note.Text = lb1.Text;
      }//思路大体如此吧
    }
      

  22.   

    一样的嘛,你注意看我的前台代码有个OnItemCommand="grid_d_ItemCommand",这里就是声明了子DataGrid的ItemCommand事件,如下<asp:TemplateColumn HeaderText="datagrid">
    <ItemTemplate>
    <asp:DataGrid ID=grid_d Runat=server OnItemCommand="grid_d_ItemCommand"
    AutoGenerateColumns=False>
    <Columns>
       <asp:BoundColumn DataField="a" HeaderText="a"></asp:BoundColumn>
       <asp:TemplateColumn HeaderText="test">
    <ItemTemplate>
    <asp:LinkButton ID=link1 Runat=server CommandName=link1 Text=showme></asp:LinkButton>
    </ItemTemplate>
    </asp:TemplateColumn>
            </Columns></asp:DataGrid>
       </ItemTemplate>
    </asp:TemplateColumn>
      

  23.   


     stoneallen(我不想说,我很亲切)
    ------------------老大的思路不错,我用就报错,我看,问题的关键在于,我无法取得
    选择了子grid的那一行,而在主grid的ItemCommand时间中,也无法判断
    当前执行的命令对象的ID !
      

  24.   

    <asp:DataGrid ID=grid_d Runat=server OnItemCommand="grid_d_ItemCommand"
    AutoGenerateColumns=False>
    ---------------------------------
    后台加上这个,前台就报错了
      

  25.   

    <asp:DataGrid ID=grid_d Runat=server OnItemCommand="grid_d_ItemCommand"
    AutoGenerateColumns=False>
    ---------------------------------
    后台加上这个,前台就报错了--------------------------------谁叫你在后台加的,这个本来就是前台的
      

  26.   

    <asp:DataGrid ID=grid_d Runat=server OnItemCommand="grid_d_ItemCommand"
    AutoGenerateColumns=False>
    ---------------------------------
    在 html 编辑里加的,在前台,没有地方加呀
      

  27.   

    我把我的测试代码发给你参考一下吧前台:
    <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns=False>
    <Columns>
    <asp:BoundColumn DataField="a" HeaderText="a"></asp:BoundColumn>
    <asp:BoundColumn DataField="b" HeaderText="b"></asp:BoundColumn>
    <asp:BoundColumn DataField="c" HeaderText="c"></asp:BoundColumn>
    <asp:BoundColumn DataField="d" HeaderText="d"></asp:BoundColumn>
    <asp:TemplateColumn HeaderText="test">
    <ItemTemplate>
    <asp:Button ID=show CommandName="show" Runat=server Text=show></asp:Button>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="datagrid">
    <ItemTemplate>
    <asp:DataGrid ID=datagrid2 Runat=server OnItemCommand="DataGrid2_ItemCommand" AutoGenerateColumns=False>
    <Columns>
    <asp:BoundColumn DataField="a" HeaderText="a"></asp:BoundColumn>
    <asp:BoundColumn DataField="b" HeaderText="b"></asp:BoundColumn>
    <asp:BoundColumn DataField="c" HeaderText="c"></asp:BoundColumn>
    <asp:BoundColumn DataField="d" HeaderText="d"></asp:BoundColumn>
    <asp:TemplateColumn HeaderText="button">
    <ItemTemplate>
    <asp:Button ID=showme Runat=server CommandName=showme Text=showme></asp:Button>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    </asp:DataGrid>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    </asp:DataGrid>后台:
    private void InitializeComponent()
    {
    this.DataGrid1.ItemCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_ItemCommand);
    this.Load += new System.EventHandler(this.Page_Load);
    }
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if(!IsPostBack)
    {
    GridBind(DataGrid1);
    }
    }
    private void GridBind(DataGrid dg)
    {
    DataTable dt = new DataTable();
    DataColumn dc1 = new DataColumn();
    dc1.ColumnName = "a";
    dt.Columns.Add(dc1);
    DataColumn dc2 = new DataColumn();
    dc2.ColumnName = "b";
    dt.Columns.Add(dc2);
    DataColumn dc3 = new DataColumn();
    dc3.ColumnName = "c";
    dt.Columns.Add(dc3);
    DataColumn dc4 = new DataColumn();
    dc4.ColumnName = "d";
    dt.Columns.Add(dc4);
    DataRow dr;
    dr = dt.NewRow();
    dr["a"] = "a1";
    dr["b"] = "b1";
    dr["c"] = "c1";
    dr["d"] = "d1";
    dt.Rows.Add(dr);
    dr = dt.NewRow();
    dr["a"] = "a2";
    dr["b"] = "b2";
    dr["c"] = "c2";
    dr["d"] = "d2";
    dt.Rows.Add(dr);
    dg.DataSource = dt;
    dg.DataBind();
    }
    private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    if(e.CommandName == "show")
    {
    GridBind(((DataGrid)e.Item.FindControl("datagrid2")));
    }
    }
    protected void DataGrid2_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
    if(e.CommandName == "showme")
    {
    Response.Write(e.Item.Cells[0].Text);//输出点击行的第一列的值
    }
    }
      

  28.   

    我这里的前台指的就是html,后台指的是.cs代码,明白吗?
      

  29.   

    再一次感谢 stoneallen(我不想说,我很亲切)
    ,我这个版只能100分,否则,至少是你一个人100分
      

  30.   

    foreach(DataGridItem di in datagrid.items)
    {
         DataGrid dg=di.findControl("subgridname");
         ....(对子datagrid处理)
         
         
    }
    一个两层的循环就可以达到你的效果的
    不过我通常都用的Repeater.