我有一个DataGrid dg,绑定的数据源是一个datatable dt,现在我想删除dg的一行,同时删除dt中的相应行,重新绑定来实现删除后的刷新由于dt的来源有很多,指的是根据不同的查询条件会得到不同的结果,查询的数据库中的表是固定的,所以不能从dt的来源上着手,只能从dt上着手,而用户可以对dg中的每一列进行排序,所以无法根据dg中选中行索引来得到它在dt中的索引可能需要通过主键来找到相应的行,请大家分表为单一主键和联合主键两种情况给出解决办法,多谢
例如我一个页面中dg的数据来源为表A,主键为id
另一个页面中dg的数据来源为表B,主键为uid,gid,name

解决方案 »

  1.   

    单一主键就不用讲了.根据DataKeys[索引]去删除dt的数据
    联合主键可以这样   dt.Columns.Add("keyId", typeof(string),"uid+','+gid");然后绑定.指定DataKeyField = "keyId";删除时先取出key值,然后用, 分成两个值.然后根据两个字段值去删除dt的数据.
      

  2.   

    多谢慕白兄有指点,通过你的方法我可以获得要删除行的主键了,但是如何通过主键去dt中删除相应行,兄弟新手,刚才在网上翻了半天,自己还是没搞定,我用
    dt.Rows.Find(id).Delete();
    提示表没有主键还得麻烦慕白兄再指点一下,单一主键和联合主键都说明一下吧,多谢
      

  3.   

    对于单一主键, dt.PrimaryKey = new DataColumn[] {dt.Columns["id"] }
     dt.Rows.Find(id).Delete();
      

  4.   

    联合主键,也不用拆分了   DataRow[] rows = dt.Select("keyid='1,2'");
            for (int i = 0; i < rows.Length; i++)
            {
                rows[i].Delete();
            }
      

  5.   

    这个id是我通过如下代码取得的dg中选中行的主键
    int selectedIndex = Convert.ToInt32(dg.SelectedRows[0]);
    string id = dg.DataKeys[selectedIndex].ToString();
      

  6.   

    多谢慕白兄了,单一主键的已经成功了,联合主键的只是以后会有这个需求,暂时还没测试环境联合主键不用拆分的方法我倒是看懂了,不过如果主键比较多,数据量比较大时,这样会影响效率吧,感觉还是拆分的好点拆分的是不是这样做
    dt.PrimaryKey = new DataColumn[] {dt.Columns["uid"],dt.Columns["gid"] };
    dt.Rows.Find(uid,gid).Delete();先结帖了,慕白兄如果有时间就帮我看看拆分的那样写对不对,如果没时间就不用了,我用到的时候再研究下