Подтвердить что ты не робот

Как получить выбранный DataRow в DataGridView?

У меня есть DataTable, связанный с DataGridView. У меня включен FullRowSelect в DGV. Есть ли способ получить выбранную строку как DataRow, чтобы я мог получить строго типизированный доступ к выбранным значениям строк?

4b9b3361

Ответ 1

Я не уверен, как это сделать без BindingSource, вот как это сделать с одним:

var drv = bindingSoure1.Current as DataRowView;
if (drv != null)
  var row = drv.Row as MyRowType;

Ответ 2

DataRowView currentDataRowView = (DataRowView)dgv1.CurrentRow.DataBoundItem
DataRow row = currentDataRowView.Row

Ответ 3

Это возможно, получив следующее свойство:

this.dataGridView.SelectedRows

Получается набор типов: DataGridViewSelectedRowCollection. Он содержит элементы типа: DataGridViewRow.

Тогда можно получить bounditem с собственным типом следующим образом:

DataGridViewSelectedRowCollection list = this.dataGridViewInventoryRecords.SelectedRows;
MyType selectedItem = (MyType)list[0].DataBoundItem; //[0] ---> first item

Ответ 4

Вы должны иметь возможность напрямую использовать выбранную строку в строго типизированной строке, связанной с DataGridView.

Ответ 5

Вы пытаетесь это сделать.

DataRow row = gridView1.GetDataRow(gridView1.FocusedRowHandle);
if (row != null)          {             XtraMessageBox.Show(row["ID"].ToString());          }          else             return;

Ответ 6

Если вы привязали свой datagridview к таблице или представлению в базе данных, вы можете получить данные как строго типизированные объекты.

Этот ответ предназначен для формы Windows, которая связана с базой данных с использованием DataSet во время разработки. Имя примера - DataSet1, а имя таблицы example - Customer_Info.

// cast the data bound item to DataRowView so you have
// access to "Row", which
// has the actual data for the row in typed fields. 
DataRowView drv = dgv.SelectedRows(0).DataBoundItem as DataRowView;
// run the code and look at the debugger value of drv.Row -- 
// the type will be shown
// which is the type created by the data binding, representing 
// your table or view
//{YourDataSetName.YourTableOrViewType} tmpTableData = drv.Row as {YourDataSetName.YourTableOrViewType};
DataSet1.Customer_InfoRow tmpTableData = drv.Row as DataSet1.Customer_InfoRow;

Эта ссылка является ответом. Надеюсь, я добавил ясность и пример выше. https://social.msdn.microsoft.com/Forums/windows/en-US/f252e395-58e6-4703-ba7b-0740efcbecf3/can-i-convert-the-selected-row-in-a-bound-datagridview-to-a-typed-datarow?forum=winformsdatacontrols

Эта ссылка показывает данные, программно добавленные к источнику данных, а не вытягивание этих данных из существующей базы данных. Это помогло мне ответить: https://msdn.microsoft.com/en-us/library/4wszzzc7(v=vs.110).aspx

Ответ 7

Невозможно иметь строго типизированный доступ к представлению datagridview, если в наборе данных не используется табличный адаптер.

Чтобы иметь доступ к строго типизированным переменным, когда datagridview привязан к datatable через источник привязки, выполните следующие действия:

Создайте новый проект.

Вставьте DataSet с именем ds1 и DataTable с именем dt99 с столбцами с именем DataColumn1 и DataColumn2, оба типа string.

введите описание изображения здесь

Добавьте datagridView в основную форму и привяжите ее к dt99

введите описание изображения здесь

Итак, dt99BindingSource соединяет datagridview и datatable

введите описание изображения здесь

Добавить и обработчик событий для изменения выбора документа datagridview и вставить следующий фрагмент кода

private void dataGridView1_SelectionChanged (отправитель объекта, EventArgs e) {

  ds1.dt99Row d= ((ds1.dt99Row)((DataRowView)dt99BindingSource.Current).Row);

  Debug.WriteLine(d.DataColumn1 + " " + d.DataColumn2);

}

Теперь у вас есть строго типизированные переменные (d.DataColumn1 и d.DataColumn2) для доступа к ячейкам, выбранным в datagridview

Еще одна интересная особенность заключается в том, что данные, вставленные внутри набора данных, предоставляют набор открытых классов, которые помогают при обработке данных, например

        private void Form1_Load(Object sender, EventArgs e)
    {
        ds1.dt99.Adddt99Row("K", "B");
        ds1.dt99.Adddt99Row("L", "D");
        ds1.dt99.Adddt99Row("M", "F");
        ds1.dt99.Adddt99Row("N", "H");

        ds1.dt99Row dr = ds1.dt99.Newdt99Row();
        dr.DataColumn1 = "X";
        dr.DataColumn2 = "Y";
        ds1.dt99.Adddt99Row(dr);

    }