相关文章推荐
耍酷的蘑菇  ·  excel - ...·  9 月前    · 
儒雅的钢笔  ·  搜索 ...·  1 年前    · 
英俊的羊肉串  ·  Page.EnableEventValida ...·  1 年前    · 
瘦瘦的钢笔  ·  CURL设置超时时间_curl ...·  1 年前    · 

正确解决办法:
1.对于要读取数据的时候。直接取出绑定的行即可
DataRowView drv = dataGridView1.Rows[e.RowIndex].DataBoundItem as DataRowView;
DataRow dtr = drv.Row;
////注:此处的e为事件方法中的DataGridViewCellFormattingEventArgs e变量。

//// http://www.cnblogs.com/yongtao/archive/2010/03/17/1688368.html

2.对于要修改数据的时候。加一步取出Index即可
DataRowView drv = dataGridView.SelectedRows[0].DataBoundItem as DataRowView;
int index = dataTable.Rows.IndexOf(drv.Row);

//// http://www.cnblogs.com/yongtao/archive/2010/03/17/1688368.html

private void dataGridView1_Sorted(object sender, EventArgs e)
{
string _sortStr = this.dataGridView1.SortedColumn.Name; //取得当前排序列列名

SortOrder _so = this.dataGridView1.SortOrder;//取得排序顺序
if (_so == SortOrder.Ascending)
{
_sortStr += " asc";
}
else
{
_sortStr += " desc";
}

DataView _dv = this.dtb.DefaultView;
_dv.Sort = _sortStr;   //排序
this.dtb = _dv.ToTable();  //将排序后的datatable赋给dataGridView1所绑定this.dtb
}

评点。此方法确实对原始DataTable给予了排序。
但是在使用的过程中你会发现:DataTable中的顺序与DataGridView的排列并不完全一样。仍然会导致错误。而且不容易发现问题。

//// http://www.cnblogs.com/yongtao/archive/2010/03/17/1688368.html

“不要直接把DATATABLE绑定到GridView上,用DataTable.DefaultView来进行绑定,那么Gridview上的顺序和DataView里的顺序就是一样的了”

评点:事实证明。结果和直接绑定DataTable效果一样。对DataGridView的排序并没有影响到DataTable.DefaultView。

//// http://www.cnblogs.com/yongtao/archive/2010/03/17/1688368.html

来源:
http://www.baddog.idv.tw/notebook.php?mo=notebook&fn=view&id=5

原文:
DataGridView排序後,如何抓取綁定資料的正確索引值

今天在寫Windows From程式時,發現DataGridView在與DataTable透過BindingSource綁定,在DataGridView進行資料的排序後,DataGridView中的資料Index將會與DataTable的Index不一致,當選定的資料在進行修改後,因Index的不一致,導致在回存資料庫的時候無法斷定該回存哪一筆Row Data,這讓我很苦惱,一度想把DataGridView的排序給關閉,不讓使用者操作,不過想想,這也不是根本的解決之道,況且在我的程式中,這DataGridView的排序是必要的,不然會造成使用者操作的不方便....

在網路上找了好久,大部分都直接叫我關掉排序的功能....看到真是無言....,最後終於讓我找到解決方法,方式如下:

// DataRowView drv = dataGridView.CurrentRow.DataBoundItem as DataRowView;
DataRowView drv = dataGridView.SelectedRows[0].DataBoundItem as DataRowView;
int index = dataTable.Rows.IndexOf(drv.Row);

看程式看不懂嗎?說明如下:

先利用DataRowView.SeletedRows找到目前選擇的某一行資料,然後轉換成DataRowView,在DataRowView中有一個屬性叫做Row,其代表DataTable中的DataRow,最後再利用DataTable.rows.IndexOf()方法回傳當前的Index。

如此一來,在DataGridView排序後,仍可順利的取得目前編輯的資料在DataTable中的正確索引為何了