问题如下:
我在datagridview中想使用列的自动排序功能,但是给我带来的一些问题。比如:我想通过双击datagridview中的一条记录来打开这条记录查看,正常情况下是没有问题的,但当我点击列标头对列进行排序后,再通过双击datagridview中的一条记录来打开这条记录查看时,发现打开的不是我选中要查看的那条记录,而是另外的一条记录,不知道是什么原因?请大家帮忙!
我在datagridview中想使用列的自动排序功能,但是给我带来的一些问题。比如:我想通过双击datagridview中的一条记录来打开这条记录查看,正常情况下是没有问题的,但当我点击列标头对列进行排序后,再通过双击datagridview中的一条记录来打开这条记录查看时,发现打开的不是我选中要查看的那条记录,而是另外的一条记录,不知道是什么原因?请大家帮忙!
不过我用了个笨点的办法达到预期效果了
就是把列标头的排序功能关闭
dataGridViewGrade.Columns[?].SortMode = DataGridViewColumnSortMode.NotSortable;
不知道楼主愿不愿意这么做?
不要从原始绑定的数据里面选呀
在datagridview_RowHeaderMouseDoubleClick事件里面
取得datagridview.Rows[e.RowIndex]
然后显示这个row里面的内容嘛
就不会不同步拉
贴段代码出来看看呀!!
可能是你的index没有更新的原故吧
代码如下:请帮分析分析
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
try
{
row = this.dataTable.Rows[e.RowIndex];
if (this.Selection)
{
assign.GetByAssignNo(row["AssignNo"].ToString());
Close();
}
else
{
AssignForm f = new AssignForm(row["AssignNo"].ToString());
f.MdiParent = this.ParentForm;
f.Show();
this.ParentForm.ToString();
}
}
catch
{
MessageBox.Show("操作错误,当前没有记录!");
}
}
建议你这样:
添加下面的函数this.dataGridView1.Sorted += new System.EventHandler(this.dataGridView1_Sorted);
你自己要在类中保存一个变量,标示Table中的数据是否经过排序
1,如果Table中数据没有经过排序,this.dataGridView1_Sorted方法中对Table进行排序
2,如果Table中数据已经经过排序,this.dataGridView1_Sorted方法中对Table中数据进行Reverse
这样,Table中的数据,和画面中的数据的顺序就一致了。
希望对楼主有所帮助。
上面我提到的关于排序的问题,如果是多个列进行排序,实现起来有些困难,所以建议是用下面的方案。将Table中的所有主键都绑定到dgv中,不过画面中不需要现实的字段,将这一列的Visible设定为false,等到需要去某条数据显示的时候,你就先把dgv中的主键取出来,然后到Tabel中检索相应的数据就可以了,实例代码参加下面。
Table的定义如下:
假定column3就是table的主键,只是绑定到dgv中,并不显示
DataColumn c = new DataColumn("column1", typeof(string));
DataColumn c2 = new DataColumn("column2", typeof(string));
DataColumn c3 = new DataColumn("column3", typeof(int));
dataTable.Columns.Add(c);
dataTable.Columns.Add(c2);
dataTable.Columns.Add(c3);
DataRow r1 = dataTable.NewRow();
r1[0] = "111";
r1[1] = "211";
r1[2] = 1;
dataTable.Rows.Add(r1);
DataRow r2 = dataTable.NewRow();
r2[0] = "122";
r2[1] = "222";
r2[2] = 2;
dataTable.Rows.Add(r2);
DataRow r3 = dataTable.NewRow();
r3[0] = "133";
r3[1] = "233";
r3[2] = 3;
dataTable.Rows.Add(r3);
this.dataGridView1.DataSource = dataTable;
在dgv生成时,做如下操作:
this.Column3.DataPropertyName = "column3";
this.Column3.HeaderText = "Column3";
this.Column3.Name = "Column3";
this.Column3.Visible = false;
双击事件的时候作如下处理就好了:
dataGridView1_CellDoubleClick
{
int key = (int)this.dataGridView1.Rows[e.RowIndex].Cells[2].Value;
//这样key就取到了,到table 中去检索数据吧
}
if (e.columns["columnsname"!=null)//or if(e.columns.index==?(int))