问题如下:
我在datagridview中想使用列的自动排序功能,但是给我带来的一些问题。比如:我想通过双击datagridview中的一条记录来打开这条记录查看,正常情况下是没有问题的,但当我点击列标头对列进行排序后,再通过双击datagridview中的一条记录来打开这条记录查看时,发现打开的不是我选中要查看的那条记录,而是另外的一条记录,不知道是什么原因?请大家帮忙!

解决方案 »

  1.   

    lz:我没有遇到过这样的情况,建立在列、行的双击事件里跟踪代码,看看DataGridViewRows发生怎样的变化,也许能找到原因。
      

  2.   

    我也有遇到这样的事 也不知道怎么解决
    不过我用了个笨点的办法达到预期效果了
    就是把列标头的排序功能关闭
    dataGridViewGrade.Columns[?].SortMode = DataGridViewColumnSortMode.NotSortable;
    不知道楼主愿不愿意这么做?
      

  3.   

    lz在双击事件里面直接取得显示得datagridview里面得这个index的内容
    不要从原始绑定的数据里面选呀
    在datagridview_RowHeaderMouseDoubleClick事件里面
    取得datagridview.Rows[e.RowIndex]
    然后显示这个row里面的内容嘛
    就不会不同步拉
      

  4.   

    楼上说的到是有道理,不过有个问题,我在数据库中的记录字段并不会都取出并显示在datagridview表格中,大部分只取出一些字段信息用于显示,这样一来上面这个方法好像就行不通了吧。不过,还是要谢谢你的关心。
      

  5.   

    winform  
    贴段代码出来看看呀!!
    可能是你的index没有更新的原故吧
      

  6.   


    代码如下:请帮分析分析
    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("操作错误,当前没有记录!");
                    }
            }
      

  7.   

    主要问题是你的画面上的数据的被排序后,跟你Table中的数据的顺序不一致造成的
    建议你这样:
    添加下面的函数this.dataGridView1.Sorted += new System.EventHandler(this.dataGridView1_Sorted);
    你自己要在类中保存一个变量,标示Table中的数据是否经过排序
    1,如果Table中数据没有经过排序,this.dataGridView1_Sorted方法中对Table进行排序
    2,如果Table中数据已经经过排序,this.dataGridView1_Sorted方法中对Table中数据进行Reverse
    这样,Table中的数据,和画面中的数据的顺序就一致了。
    希望对楼主有所帮助。
      

  8.   

    smallboy_5(阿杰):谢谢,我觉的应该是你说的这个原因,可是我不明白的是,如何才能使画面上的数据与Table中的数据保持一致呢?比如,我可能要对多个列启用自动排序功能,这样以来我又如何对Table中的数据进行排序呢?能不能说的详细点,再次谢过。
      

  9.   

    关于你这个问题,我写了个例子程序,见下面希望对你有所帮助。
    上面我提到的关于排序的问题,如果是多个列进行排序,实现起来有些困难,所以建议是用下面的方案。将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 中去检索数据吧
    }
      

  10.   

    row = this.dataGridView1.Rows[e.RowIndex];
     if (e.columns["columnsname"!=null)//or if(e.columns.index==?(int))