假如我选中DataGridView中的某一行,如何才能得到该行在DataGridView绑定的DataTable中对应的DataRow

解决方案 »

  1.   

    ((DataRowView) gvVersion.SelectedRow.DataItem).Row
    或者
    设置DataKeyNames,然后同过关键值找到DataTable中的那个行
      

  2.   

    dgv.SelectedRows[0].Index
    ((DataRowView) gvVersion.SelectedRow.DataItem).Row
    都是正确的.
      

  3.   

    参看
    http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c44c.aspx#q934q
      

  4.   

    To get the selected rows in a DataGridView control
    Use the SelectedRows property. To enable users to select rows, you must set the SelectionMode property to FullRowSelect or RowHeaderSelect.C# Copy Code
    private void selectedRowsButton_Click(object sender, System.EventArgs e)
    {
        Int32 selectedRowCount =
            dataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected);
        if (selectedRowCount > 0)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();        for (int i = 0; i < selectedRowCount; i++)
            {
                sb.Append("Row: ");
                sb.Append(dataGridView1.SelectedRows[i].Index.ToString());
                sb.Append(Environment.NewLine);
            }        sb.Append("Total: " + selectedRowCount.ToString());
            MessageBox.Show(sb.ToString(), "Selected Rows");
        }
      

  5.   


    Use the SelectedCells property. Note  
    Use the AreAllCellsSelected method to avoid showing a potentially large number of cells. 
     
    C# Copy Code
    private void selectedCellsButton_Click(object sender, System.EventArgs e)
    {
        Int32 selectedCellCount =
            dataGridView1.GetCellCount(DataGridViewElementStates.Selected);
        if (selectedCellCount > 0)
        {
            if (dataGridView1.AreAllCellsSelected(true))
            {
                MessageBox.Show("All cells are selected", "Selected Cells");
            }
            else
            {
                System.Text.StringBuilder sb =
                    new System.Text.StringBuilder();            for (int i = 0;
                    i < selectedCellCount; i++)
                {
                    sb.Append("Row: ");
                    sb.Append(dataGridView1.SelectedCells[i].RowIndex
                        .ToString());
                    sb.Append(", Column: ");
                    sb.Append(dataGridView1.SelectedCells[i].ColumnIndex
                        .ToString());
                    sb.Append(Environment.NewLine);
                }            sb.Append("Total: " + selectedCellCount.ToString());
                MessageBox.Show(sb.ToString(), "Selected Cells");
            }
        }
    }
      

  6.   

    如果用户自己改变datagridview 的排序方式,datgridview中对应的index和dataset中的还会一致吗
      

  7.   

    由于DataGridView如果排序过或者删除过行,DataGridView中对应的index和DataTable中对应的index肯定是不一样的,看来只能先通过DataGridView.SelectRows[0].index取得该行内容,然后在用DataTable的select方法来得到DataRow了。
      

  8.   

    to 如果用户自己改变datagridview 的排序方式,datgridview中对应的index和dataset中的还会一致吗不一致,参看我上面给的例子。
      

  9.   

    to xyh2002(凌)DataGridView.CurrentRow得到的是DataGridViewRow,不是DataGridView绑定的DataTable的DataRow
      

  10.   

    Knight94(愚翁) 你好,请教一下。
    我原来提这个问题为了解决下面这个问题,即选中DataGridView中的一行,对选中数据进行修改,但没有递交到数据库,然后按一下取消,就可以恢复到该行未修改前的状态。可是我得到了选中行对应的DataRow后,调用其CancelEdit()方法后,DataRow的RowState仍然是Modified,DataGridView的数据也没有恢复到修改前状态。
    DataRow是用下面语句获得的
    BindingManagerBase bm = DataGridView1.BindingContext[DataGridView1.DataSource];
    DataRow dr = ((DataRowView)bm.Current).Row;
      

  11.   

    直接使用DataGridView的CancelEdit方法也没用,返回是成功,但修改的数据没有恢复。
      

  12.   

    调用其CancelEdit()方法,重新刷新datagridview是否可以。
      

  13.   

    唉,不行啊,不知道这个CancelEdit()方法到底有什么用
      

  14.   

    参看msdn,
    Res
    After calling CancelEdit, all changes to the row are rolled back. You can also roll back changes by calling RejectChanges on the parent DataTable.即你调用完CancelEdit,还要对绑定的数据源调用RejectChanges方法
      

  15.   

    Knight94(愚翁),谢谢你啊,确实可以。