如果DataGrid经过排序,其顺序与DataTable中的RowIndex就对应不上了,此时如果需要从DataGrid 的当前行得到数据源DataTable中对应的行,该怎么办?相反如果DataTable.Select 得到某行,想让DataGrid中对应的行自动选中,又该怎么办?
2.0的 DataGridView 更好

解决方案 »

  1.   

    DataGrid中
    =========================
    取出DataGrid当前行对应的DataTable的值。
    //
    //DataRowView drv = (DataRowView)this.BindingContext[this.ds,this.ds.Tables[0].TableName].Current;
    DataRowView drv = (DataRowView)this.BindingContext[this.dataGrid1.DataSource,this.dataGrid1.Memeber].Current;
    获取到drv就可以改数据,
    DataRow dw = drv.Row; // 得到DataRow,
    DataTable dt = dw.Table;//得到DataTable
    DataSet ds = dt.DataSet;//得到DataSet
    ====================
    有问题的话我在blog写过一些文章,
    http://blog.csdn.net/zhzuo
      

  2.   

    关于DataGrid的一些问题更多的看,
    http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp
      

  3.   

    在datagrid中排序后是和DataTable中的RowIndex对不上,
    一个就是用dataview 帮定,然后从dataview中取数据。
    或者通过BindingManagerBase
      

  4.   

    datesetRowNumber = DataGrid.Items[gridRowNumber].DataSetIndex;
    DataRow dr = DataTable.Rows[datesetRowNumber];
      

  5.   

    =============================================================================
    第二个问题还是没什么好办法,希望大侠再指点一下!!
    -----------------------------------------------------------------------------如果DataTable.Select 得到某行,想让DataGrid中对应的行自动选中,又该怎么办?==============================================================================
      

  6.   

    DataTable.Select 得到某行,想让DataGrid中对应的行自动选中,又该怎么办?
    如下:
    private void button3_Click(object sender, System.EventArgs e)
    {
    DataRow [] drs = this.dbCategories.Select("CategoryID < 5");
    CurrencyManager currencyManager = (CurrencyManager)this.BindingContext[this.dataGrid1.DataSource,this.dataGrid1.DataMember];
    //for(int i = 0;i < dataGrid1.VisibleRowCount;i++)
    for(int i = 0;i < currencyManager.Count;i++)
    {
    DataRowView drv = (DataRowView)currencyManager.List[i];
    DataRow dr = drv.Row;
    if(Array.IndexOf(drs,dr) != -1)
    {
    this.dataGrid1.Select(i);
    }
    }
    }
      

  7.   

    1楼好象不对啊。
    楼主这个问题也是我想问的。
    对列排序后,this.BindingContext[DataSetName,"TableName"].Position=?帮楼主顶!
      

  8.   

    zhzuo(秋枫) 这办法我早想过了,感觉不大好,所以才说没什么好办法。其实按照这个思路,根本不用数据绑定,只要直接在 DataGrid(或 DataGridView) 中查找就行了,   只是--典型情况下,要遍历半个表,最坏情况下,要遍历整个表
      

  9.   

    CurrencyManager cm=(CurrencyManager)this.BindingContext[dataGrid1.DataSource];
    不要选择dataMember,然后对dataGrid1绑定到dataView上,也就是
    DataView mdv=dt1.Tables["person"].DefaultView;
    dataGrid1.DataSource=mdv;
    dataGrid1的行号ataGrid1.CurrentCell.RowNumber和cm.Position相等
      

  10.   

    我上面的回复应该能满足你的要求了吧,直接用cm.Position=i;看看dataGrid1一定指向在i行(0行为第一行)吧
      

  11.   

    看了秋枫给你的回复(多选),我再补充一下:
    DataRow [] drs = this.dataset.Tables[0].Select("age<60");
    DataView mdv=(DataView)dataGrid1.DataSource;
    foreach(DataRow rw in drs)
    {
    for(int i=0;i<cm.Count;i++)
    {
    DataRow dr=mdv[i].Row;
    if(dr==rw)
    {
    dataGrid1.Select(i);
    break;
    }
    }//endfor
    }//endforeach
    dataGrid1.Focus();
    不过那样有点画蛇添足的味道,不如直接判断
    DataView mdv=(DataView)dataGrid1.DataSource;
    for(int i=0;i<cm.Count;i++)
    {
    if(int.Pase(mdv[i]["age"].ToString())<60)
    dataGrid1.Select(i);
    }
    dataGrid1.Focus();