页面上有两个gridview控件,分别为gridview1和gridview2,现在在gridview1中设置了一个checkbox控件,通过点击checkbox将gridview1中对应的行传递到gridview2中:    protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        DataTable tb = new DataTable();
        for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
            if (cbox.Checked == true)
            {
                DataRow D2 = GridView1.Rows[i];
                tb.Rows.Add(D2);
            }
            else
            {
                tb.Rows.Remove(D2);
            }
        }
        GridView2.DataSource = tb;
        GridView2.DataBind();
    }现在就是提示DataRow D2 = GridView1.Rows[i];这一句错误,无法将类型“System.Web.UI.WebControls.GridViewRow”隐式转换为“System.Data.DataRow”。
这一句该如何写啊?

解决方案 »

  1.   

     GridView1.Rows[i];   这个返回的类型是 GridViewRow跟你写的Datarow不是一个类型当然错了你的数据如果少的话。就把gridview1的Datasource留下来,比如变量是tb1
    tb.rows.add(   tb1.row[*] )
      

  2.   


    DataRow D2 = (DataRow)GridView1.Rows[i];
    上面的强制转化是不够严密的,看你的GridView的绑定结构了。建议你建立GridView1的datasource的copy,结合checkbox的选中集合来操作绑定。
      

  3.   

    提取 DataGridView 的数据源的数据来写入到新的数据表中。
      

  4.   


    if(CheckBox1.Checked)
    {
        this.GridView2.DataSource = this.GridView1.DataSource;
        this.GridView2.DataBind();
    }
      

  5.   

    是不是有很多行?
      先把要的数据 选中   然后一次性添加到GridView2里面去?
       如果是这样  有两种办法
      一是   自己定义个DataTable dt2=new DataTable()  然后用一个循环
        把选中的行  的数据 一行一行 获取 再手动 添加到这个DataTable里去
        再把这个dt2绑定到GridView2 第二种方法是   想用循环获取选定行的主键
      再通过这些主键 查询一次数据出  返回 DataTable
       再将这个DataTable绑定到GridView上面去  
     
      
      

  6.   

    不是要传递全部的行的,在gridview1中每一行都有个checkbox控件,通过点击checkbox将对应行传递到gridview2中的。是这么个需求。
      

  7.   

    GridView2.DataSource = GridView1.DataSource;不过你的字段名称要一样的
      

  8.   

    你可以这样试一下:
    string[] str = new string[n]; //n是gridview中的列数
            DataTable dt = new DataTable();
            if (cbox.Checked == true)
            {
                str[0] = gv.Rows[i].Cells[0].Text.ToString();
                str[1] = gv.Rows[i].Cells[1].Text.ToString();
                .
                .
                .
                str[n] = gv.Rows[i].Cells[n-1].Text.ToString();
                dt.Rows.Add(str);        } 
    可能会有点麻烦,但应该会好用
      

  9.   


      把你选中的数据添加数据集中,然后再将数据集的数据添加到另1个gridview
      

  10.   

    实际上就是建立一个新的数据集,将gridview1中选中的行的数据传递到该数据集中,然后作为gridview2的数据源datasource。
    想想应该是这么简单,不过就是不知道该如何实现啊。
      

  11.   

    后来用了两个方法解决,一个就是借用缓存了,
        protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
        {
            DataSet myds = (DataSet)Cache["D2"];
            DataTable tb = new DataTable();
            tb = myds.Tables[0].Clone();
            for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
            {
                CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
                if (cbox.Checked == true)
                {
                    cbox.Checked = true;
                    DataRow D2 = (DataRow)myds.Tables[0].Rows[i];
                    tb.Rows.Add(myds.Tables[0].Rows[i].ItemArray);
                }
                else
                {
                    cbox.Checked = false;
                }
            }
            GridView2.DataSource = tb;
            GridView2.DataBind();
       }
    不过感觉上功能还是有欠缺,后来还是用数组的方法解决了,将gridview1的行读到数组中,然后在SQL中后台筛选了。
      

  12.   

    那代码是写在第一个的aspx,页面下面的,所以GridView2.DataSource = tb;
      GridView2.DataBind();肯定会有波浪线,显示找不到GridView2啊