У меня есть DataTable, связанный с DataGridView. У меня включен FullRowSelect в DGV. Есть ли способ получить выбранную строку как DataRow, чтобы я мог получить строго типизированный доступ к выбранным значениям строк?
Как получить выбранный DataRow в DataGridView?
Ответ 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);
}