2009-02-16 11 views
0

Je veux montrer une relation maître/détail en utilisant deux datagridviews et DataRelation en C#.DataGrid/Detail datagridview avec relation de type string en C#

La relation entre le maître et la table de détail est un ID de type chaîne (et il n'y a aucune chance de changer l'ID en type entier).

Il semble que DataGridView ne soit pas en mesure de mettre à jour la vue détaillée lors du changement de ligne dans la table principale.

Est-ce que quelqu'un sait s'il est possible d'obtenir une vue maître/détail en utilisant un ID de chaîne et si oui, comment? Ou dois-je utiliser un DataGrid externe d'une autre société?

Personnellement, je ne vois pas de différence dans l'utilisation d'une chaîne au lieu d'un entier. La seule chose que je peux penser est que la grille ne peut pas gérer une vue de détail principale en utilisant une relation d'identification de chaîne. MISE À JOUR: Le problème est résolu, le problème était qu'une relation était de type nchar et avait des blancs à la fin de la chaîne. Merci pour l'aide!

Voici un exemple, créez un nouveau projet VS 2008 et copiez le code. Changez la chaîne de connexion et la connexion de données:

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Windows.Forms; 

public class Form1 : System.Windows.Forms.Form 
{ 
    private DataGridView masterDataGridView = new DataGridView(); 
    private BindingSource masterBindingSource = new BindingSource(); 
    private DataGridView detailsDataGridView = new DataGridView(); 
    private BindingSource detailsBindingSource = new BindingSource(); 

    [STAThreadAttribute()] 
    public static void Main() 
    { 
     Application.Run(new Form1()); 
    } 

    // Initializes the form. 
    public Form1() 
    { 
     masterDataGridView.Dock = DockStyle.Fill; 
     detailsDataGridView.Dock = DockStyle.Fill; 

     SplitContainer splitContainer1 = new SplitContainer(); 
     splitContainer1.Dock = DockStyle.Fill; 
     splitContainer1.Orientation = Orientation.Horizontal; 
     splitContainer1.Panel1.Controls.Add(masterDataGridView); 
     splitContainer1.Panel2.Controls.Add(detailsDataGridView); 

     this.Controls.Add(splitContainer1); 
     this.Load += new System.EventHandler(Form1_Load); 
     this.Text = "DataGridView master/detail demo"; 
    } 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     // Bind the DataGridView controls to the BindingSource 
     // components and load the data from the database. 
     masterDataGridView.DataSource = masterBindingSource; 
     detailsDataGridView.DataSource = detailsBindingSource; 
     GetData(); 

     // Resize the master DataGridView columns to fit the newly loaded data. 
     masterDataGridView.AutoResizeColumns(); 

     // Configure the details DataGridView so that its columns automatically 
     // adjust their widths when the data changes. 
     detailsDataGridView.AutoSizeColumnsMode = 
      DataGridViewAutoSizeColumnsMode.AllCells; 
    } 

    private void GetData() 
    { 
     try 
     { 
      // Specify a connection string. Replace the given value with a 
      // valid connection string for a Northwind SQL Server sample 
      // database accessible to your system. 
      String connectionString = 
       ""; 
      SqlConnection connection = new SqlConnection(connectionString); 


      // Create a DataSet. 
      DataSet data = new DataSet(); 
      data.Locale = System.Globalization.CultureInfo.InvariantCulture; 

      // Add data from the Customers table to the DataSet. 
      SqlDataAdapter masterDataAdapter = new 
       SqlDataAdapter("select * from customers", connection); 
      masterDataAdapter.Fill(data, "Customers"); 

      // Add data from the Orders table to the DataSet. 
      SqlDataAdapter detailsDataAdapter = new 
       SqlDataAdapter("select * from orders", connection); 
      detailsDataAdapter.Fill(data, "Orders"); 

      // Establish a relationship between the two tables. 
      DataRelation relation = new DataRelation("CustomersOrders", 
       data.Tables["Customers"].Columns["strID"], 
       data.Tables["Orders"].Columns["strID"]); 
      data.Relations.Add(relation); 

      // Bind the master data connector to the Customers table. 
      masterBindingSource.DataSource = data; 
      masterBindingSource.DataMember = "Customers"; 

      // Bind the details data connector to the master data connector, 
      // using the DataRelation name to filter the information in the 
      // details table based on the current row in the master table. 
      detailsBindingSource.DataSource = masterBindingSource; 
      detailsBindingSource.DataMember = "CustomersOrders"; 


     } 
     catch (SqlException) 
     { 
      MessageBox.Show("To run this example, replace the value of the " + 
       "connectionString variable with a connection string that is " + 
       "valid for your system."); 
     } 
    } 
} 
+0

Exact duplicate - http://stackoverflow.com/questions/553098/master-detail-datagridview-with-relation-from-type-string-in-c. Fermeture recommandée de la question. L'utilisateur semble également avoir créé un nouveau compte à cette fin. – Cerebrus

+0

@ ds1, s'il vous plaît lire la FAQ Stackoverflow pour les directives de publication. – Cerebrus

+0

Salut Cerebrus, oui, désolé à ce sujet, il semble juste que je ne peux pas fermer mon premier poste sous le nom "Daniel" parce qu'à ce moment j'étais un utilisateur anonyme, n'hésitez pas à fermer le premier post http: // stackoverflow.com/questions/553098/master-detail-datagridview-with-relation-from-type-string-in-c – user66928

Répondre

0

J'ai regardé votre code et cela semble fondamentalement OK. S'il vous plaît essayez de le couper un peu plus loin cependant.

Mais je trouve les noms de champs "strId" un peu suspect, est-ce vraiment ce que les colonnes sont appelées dans la base de données? Astuce: Mettez une pause sur la ligne Relations.Add (relation) et inspectez soigneusement l'objet relation.

Le code ne montre pas où/comment les composants bindinsource sont créés, peut-être qu'ils ont des propriétés de designtime (Filter).