2017-10-04 4 views
0

Je veux jeter un DataRow objet personnalisé, lorsque je double cliquez sur une ligne, donc ce qu'il ce qui me semble la bonne façon de le faire:Coulée d'un DataRow dans DataGridView vers un objet personnalisé?

DataRowView selectedRow = (DataRowView)gv_Search.Rows[e.RowIndex].DataBoundItem; 
//this to see the data, but the table contains all the rows in the grid 
var table = selectedRow.DataView.ToTable(); 

les données dans la grille est une vue de SQL, J'ai généré une classe contenant les mêmes données que la vue, donc je veux quand je double clique sur DataGridView la ligne sélectionnée est castée au type que j'ai créé

+0

Pouvez-vous jeter comme par ce poste? https://stackoverflow.com/questions/23520195/datagridview-how-to-cast-selected-row-to-custom-object#23520452 – CalC

+0

Quand j'ai utilisé 'grid.SelectedRows [index]' il lance une exception, index hors de gamme –

+0

Utilisez-vous une BindingSource par hasard? Il n'y aurait pas besoin de demander à la grille pour sa rangée sélectionnée. – Crowcoder

Répondre

0

I généré une classe contenant les mêmes données les retours de vue, donc je veux quand je double cliquez sur le DataGridView la ligne sélectionnée est casté au type j'ai créé

Utilisation collection de cette classe comme DataSource pour DataGridView

List<MyClass> allData = GetDataFromDatabase(); 
gv_Search.DataSource = allData; 

ensuite sur la ligne clic, vous pouvez accéder à des MyClass instance sélectionnée

var selected = (MyClass)gv_Search.Rows[e.RowIndex].DataBoundItem; 

Console.WriteLine($"Selected Id = {selected.Id}"); // Use selected data 

Inside GetDataFromDatabase vous lire les données de base de données directement aux instances de MyClass

var allItems = new List<MyClass>(); 
using (var connection = New SqlConnection(connectionString)) 
using (var command = New SqlCommand(query, connection)) 
{ 
    connection.Open(); 
    using (var reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      var item = new MyClass 
      { 
       Id = reader.GetInt32(0), 
       Name = reader.GetString(1), 
       Birthdate = reader.GetDatetime(2) 
      }; 

      allItems.Add(item); 
     } 
    } 
} 

return allItems; 
0

Votre question n'est pas claire, mais si vous voulez lancer un objet personnalisé à un autre, vous pouvez utiliser Opérateur de conversion:

public static explicit operator DataRowView(VwCustomerSizes arg) 
{ 
    DataRowView drv = new DataRowView(); 
    drv.Prop1 = (Prop1Type)arg.Prop1; //of course if they need casting 
    drv.Prop2 = (Prop2Type)arg.Prop2; 
    drv.Prop3 = (Prop3Type)arg.Prop3; 
    . . . 
    drv.PropN = (PropNType)arg.PropN; 
    return drv; 
} 
0

DataRowView a une propriété qui devrait être le VwCustomerSizes que vous êtes après.