Comment puis-je obtenir les données sélectionnées dans un DataGridView?
j'ai un DataTable relié à un DataGridView. J'ai activé L'Option Select dans la DGV. Est-il un moyen d'obtenir la ligne sélectionnée comme un DataRow afin que je puisse obtenir fortement typé l'accès à la ligne sélectionnée valeurs?
7 réponses
Je ne suis pas sûr de savoir comment le faire avec une source BindingSource, voici comment le faire avec une:
var drv = bindingSoure1.Current as DataRowView;
if (drv != null)
var row = drv.Row as MyRowType;
DataRowView currentDataRowView = (DataRowView)dgv1.CurrentRow.DataBoundItem
DataRow row = currentDataRowView.Row
Il est possible par l'obtention de la propriété suivante:
this.dataGridView.SelectedRows
On obtient une collection de type: DataGridViewSelectedRowCollection. Il contient des éléments de type: DataGridViewRow.
alors on peut obtenir bounditem avec son propre type de la manière suivante:
DataGridViewSelectedRowCollection list = this.dataGridViewInventoryRecords.SelectedRows;
MyType selectedItem = (MyType)list[0].DataBoundItem; //[0] ---> first item
vous devriez être en mesure de lancer directement votre ligne sélectionnée dans la ligne fortement tapée qui était liée à DataGridView.
Vous essayez ceci.
DataRow row = gridView1.GetDataRow(gridView1.FocusedRowHandle);
if (row != null)
{
XtraMessageBox.Show(row["ID"].ToString());
}
else
return;
si vous avez relié votre datagridview à une table ou une vue dans une base de données, vous pouvez obtenir les données en tant qu'objet fortement tapé.
cette réponse est pour un formulaire Windows qui s'est connecté à une base de données en utilisant un ensemble de données au moment de la conception. Le nom d'exemple est DataSet1, et le nom d'exemple de table est 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;
Ce lien est la réponse. J'espère avoir plus de clarté et un exemple ci-dessus. 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
ce lien affiche les données programmées ajoutées à la source de données, ne pas extraire ces données d'une base de données existante. Cela m'a fait une partie du chemin vers la réponse: https://msdn.microsoft.com/en-us/library/4wszzzc7 (v=V110).aspx
Il n'est pas possible d'avoir fortement typé accès à un datagridview si un tableadapter n'est pas utilisé à l'intérieur de l'ensemble de données.
Pour avoir accès à des variables fortement typées quand un datagridview est lié à un datatable dans une bindingsource, procédez comme suit:
créer un nouveau projet.
insérez un ensemble de données nommé ds1 et un datable nommé dt99 avec des colonnes nommées DataColumn1 et DataColumn2, les deux chaînes type.
Ajouter un datagridView au formulaire principal et le lier au dt99
de sorte que la source dt99BindingSource connecte le datagridview et le datatable
ajouter et le gestionnaire d'événements pour le changement de sélection du datagridview, et insérer le morceau de code suivant
private void datagridview1_selection modified(object sender, EventArgs e) {
ds1.dt99Row d= ((ds1.dt99Row)((DataRowView)dt99BindingSource.Current).Row);
Debug.WriteLine(d.DataColumn1 + " " + d.DataColumn2);
}
Maintenant vous avez fortement tapé des variables (D. DataColumn1 et D. DataColumn2) pour accéder aux cellules sélectionnées sur datagridview
une autre caractéristique intéressante est qu'un datatable inséré dans un ensemble de données fournit un ensemble de classes publiques qui aide beaucoup lors de la manipulation des datatables, par exemple
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);
}