肯定你搞了删除操作!所以会不对!建议不要用currentrowindex,可以在填充数据的时候,直接把记录编号写入数据集中!
补充一下,你头发掉光和程序无关,可能是你的电脑辐射太强,建议换液晶!

解决方案 »

  1.   

    CurrencyManager cm = (CurrencyManager)this.BindingContext[this.dgVidicon.DataSource, this.dgVidicon.DataMember]; System.Data.DataView dv = (System.Data.DataView)cm.List; this.txtVidiconName.Text = dv[this.dgVidicon.CurrentRowIndex]["摄像机名称"].ToString();
    主要思想,取出捆绑在DataGrid中的DataView,然后从中读取相对应的Index即可我一直使用,挺好使的,好多人使用排列顺序来取,结果顺序更换之后总是很难修改程序
      

  2.   

    CurrencyManager cm = (CurrencyManager)this.BindingContext[this.dgVidicon.DataSource, this.dgVidicon.DataMember]; 
    System.Data.DataView dv = (System.Data.DataView)cm.List; for(int i = 0; i < dv.Count; ++i)  
    {
    if(this.dgVidicon.IsSelected(i))  
    {
    m_intVidiconID = Int32.Parse(dv[i]["VidiconID"].ToString());
    }
    }
      

  3.   

    m_intVidiconID = Int32.Parse(dv[i]["VidiconID"].ToString());
    这一句我看不太明白,尤其是dv[i]["VidiconID"]的具体意思。ps:n年前我就统统换液晶了,头发是自己抓下来的。
      

  4.   

    大虾的意思是不是在表中建一字段,其内容是该条记录的row?如果没有这个字段能不能实现该功能?
      

  5.   

    cnming(cnming)     的方法可以。。呵呵。
      

  6.   

    我觉得取得datagrid里某一条记录在datatable里面的记录编号不应该是件太麻烦的事,只是我太菜了,大虾们为了我脑袋上的头发,行行好吧。
      

  7.   

    我告诉你我们公司的思路吧,就是一个DataGrid绑定DataTable中的所有Column,其中有些字段不需要显示的就将DataGrid的该列Visible。需要取得ID的时候(一般都是第一个字段),直接用DataGrid[x,0]就可以得到ID了啊。
      

  8.   

    Visible=False,好主意,但是怎么设置datagrid某一行的visible属性?
      

  9.   

    m_intVidiconID = Int32.Parse(dv[i]["VidiconID"].ToString());
    这一句我看不太明白,尤其是dv[i]["VidiconID"]的具体意思。这是我的一个应用,在为DataGrid设置数据源的时候有一个字段是VidiconID在这里,我获取了DataGrid的DataView,也就是dv,这个DataView和DataGrid的当前排列顺序一致,记录条数也一致,然后我就从这个dataview中获取选中的行的数据if(this.dgVidicon.IsSelected(i))  这条语句是判断本记录是否是DataGrid中被选中的记录
      

  10.   

    如果“VidiconID”字段别修改过,这段代码是不是就不能达到设计的目的了?但是按“del”可以删除被修改过任意字段内容的记录。
      

  11.   

    不能用Visible=False,但是可以用hide
    下面的代码就有,列表框刷新函数,直接调用即可
    public static void RefreshDataGrid(System.Windows.Forms.DataGrid DG, System.Data.DataView DV, string m_strWidth, string m_strHidden, bool m_blnIsReDraw)
    {
    try
    {
    int i;
    int numCols;
    System.Windows.Forms.DataGridTableStyle ts = new System.Windows.Forms.DataGridTableStyle(); //就是它决定了datagrid是什么样的
    System.Windows.Forms.DataGridTextBoxColumn aColumnTextColumn; //要重写的东东
    System.Windows.Forms.DataGridBoolColumn aColumnBoolColumn; //要重写的东东 string[] ColumnWidths = m_strWidth.Split(';');
    string[] strHiddens = m_strHidden.Split(';'); numCols = DV.Table.Columns.Count; if (m_blnIsReDraw == true)
    {
    foreach(string strHiddenTemp in strHiddens)
    {
    if (strHiddenTemp.Length > 0)
    {
    DV.Table.Columns[strHiddenTemp].ColumnMapping = System.Data.MappingType.Hidden;
    }
    } DG.Font = new System.Drawing.Font("宋体",10,System.Drawing.FontStyle.Regular);
    } DG.DataSource = DV; if (m_blnIsReDraw == true)
    {
    ts.MappingName = DV.Table.TableName; for(i=0;i<numCols;i++) // 重绘所有的列
    {
    switch (DV.Table.Columns[i].DataType.Name)
    {
    case "Boolean": //bool Column
    aColumnBoolColumn =new System.Windows.Forms.DataGridBoolColumn();
    //要更改列头名,请改下句的HeaderText值
    aColumnBoolColumn.HeaderText = DV.Table.Columns[i].ColumnName;
    aColumnBoolColumn.MappingName = DV.Table.Columns[i].ColumnName; if (ColumnWidths.Length > i)
    {
    aColumnBoolColumn.Width = (int) (Convert.ToDouble(ColumnWidths[i]) * 50);
    } ts.GridColumnStyles.Add(aColumnBoolColumn); //增加一种自定义的column风格 break; default: //Default (Text) Column
    aColumnTextColumn =new System.Windows.Forms.DataGridTextBoxColumn();
    //要更改列头名,请改下句的HeaderText值
    aColumnTextColumn.HeaderText = DV.Table.Columns[i].ColumnName;
    aColumnTextColumn.MappingName = DV.Table.Columns[i].ColumnName; if (ColumnWidths.Length > i)
    {
    aColumnTextColumn.Width = (int) (Convert.ToDouble(ColumnWidths[i]) * 50);
    } ts.GridColumnStyles.Add(aColumnTextColumn); //增加一种自定义的column风格 break;
    }
    }
    DG.TableStyles.Clear();
    DG.TableStyles.Add(ts);
    }
    }
    catch(Exception ex)
    {
    System.Windows.Forms.MessageBox.Show(ex.Message.ToString(),"DataGrid刷新错误");
    }
    }
      

  12.   

    老大,你的代码真得不是我所需要的。我的要求很简单,就是用代码模仿 “通过删除datagrid里面的row来删除绑定到该datagrid的datatable里面的记录”这一操作时,按下“del”键所起到的删除作用。我已经研究好几天了,许多问题总是不能协调,最后所有的问题集中到一点,只要我能得到任意选中记录在datatable里面的row值(记录编号),所有的问题就都能解决了。我想过通过查找定位的方法,但是在查找定位以前,该记录所有的字段内容都可能被修改过,想要通过这个来定位很困难,几乎是不可能的。所以我一直在找其他的方法,我总认为一定会有方法得到当前datagrid里面指定的一条记录在后台datatable里面的真实位置的。
      

  13.   

    据一个例子,一开始,datagrid和datatable里面都是“1,2,3,4,5”,当我删除datagrid里面的“1”的时候,form显示datagrid的记录为“2,3,4,5”,而后台的datatable里面还是“1,2,3,4,5”,所不同的是0号记录“1”已经被打上了删除标记(.delete(),我必须这么做,不能用removeat或remove)。这时候,datagrid的0号记录已经变成了“2”(当然,该记录的内容可能已经被修改了),同一条记录在datagrid里面的记录号和datatable里面的已经不一样了。我想得到的,就是不管我的datagrid还有多少记录,也不管记录的内容到底变成了什么,这条记录在datatable里面的原始编号到底是多少。
      

  14.   

    Datagrid 和datatable中的编号本来就是不相同的常用的方法就是使用表中关键字段,然后搜索datatable,得到datatable的对应行而它们的具体编号是什么不用去管的
      

  15.   

    如果关键字段的值有重复的怎么办?
    怎样搜索datatable,得到对应行的记录号?按道理说关键字段的值不会有重复,但是当我还没有update的时候,如果不加一些特殊的控制,在datatable里面还是会存在关键字段值重复的情况的。在这种情况下,搜索datatable就无法定位了。如果我有两条以上记录关键字段的值重复,这样在搜索的时候我就不会知道到底哪一条才是我所想要的,也就是说到底哪一条才是需要删除的记录。而我用“del”键来删除记录的时候就不用加任何控制,程序会自动判断那条是要删除的。我所感兴趣的,就是程序到底是怎样来实现这个功能的。
      

  16.   

    虽然没有达到我理想中完全模仿“del”的效果,但是已经差不多了,给分。
      

  17.   

    本来你的设计思路就不应该这样,哪有两个不相干的东西挂钩在一起?DataGrid重新排列一下之后列序号就变了,如果实在要这么做,只有通过搜索DataTable里的关键列了,大不了用foreach其实也可以使用YouDataTable.Select("","",System.Data.DataViewRowState.OriginalRows);
      

  18.   

    思路好像都有问题。
    应该用对应Datagrid中主关键字字段的值。到数据库中去删除。
    另外,关键字重复的情况,在输入的时候就应该控制。而不是到数据库时再检证。