2010-08-14 8 views
2

Ce qui se passe ici est lorsque le formulaire s'ouvre, il affiche le menu contextuel et affiche le DataGridView avec la valeur de dataSet1. Mais quand je clique sur le bouton pour changer la DataSource de la Grille, cela n'affiche pas les enregistrements de dataSet2.Problème de définition DataSource d'un DataGridView

private void Form1_Load(object sender, EventArgs e) 
{ 
    SetDataSource(dataSet1);// A populated DataSet 
} 

protected void SetDataSource(DataSet ds) 
{ 
    dataGridView1.DataSource = ds; 
    ToolStripControlHost tsHost = new ToolStripControlHost(dataGridView1); 
    contextMenuStrip1.Items.Clear(); 
    contextMenuStrip1.Items.Add(tsHost); 
    contextMenuStrip1.Show(textBox1, 0, 27); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    SetDataSource(dataSet2);// Another populated DataSet 
} 

J'ai essayé d'ajouter un autre contrôle DataGridView (dataGridView2) sous ma forme, mais cette fois je ne l'a pas mis dans une ToolStripControlHost et je ne pas l'ajouter à la contextMenuStrip1.

dataGridView1.DataSource = ds; 
dataGridView2.DataSource = ds; // <-- Parent of this is the Form1, the control is not added in the contextMenuStrip. 
ToolStripControlHost tsHost = new ToolStripControlHost(dataGridView1); 
contextMenuStrip1.Items.Clear(); 
contextMenuStrip1.Items.Add(tsHost); 
contextMenuStrip1.Show(textBox1, 0, 27); 

Lorsque les charges Form1 les popups contextMenuStrip1 et le dataGridView1 est ajouté comme un élément qui lui faisant dataGridView1 à disparaître sous la forme et la dataGridView2 reste seulement dans le Form1.

Quand je frappe le button1 la dataGridView2 change sa base du contenu de son nouveau DataSource (dataSet2), tandis que le dataGridView1 affiche toujours la valeur de dataSet1. Ce que j'ai remarqué est lorsque le temps dataGridView1 est ajouté au ToolStripHost et en fait un élément dans le contextMenuStrip1, la propriété DataSource du contrôle DataGridView n'est plus modifiée. Contrairement au dataGridView2 qui reste sous la forme que je n'ai pas ajouté au contextMenuStrip1.

Répondre

6

Il m'a fallu un certain temps, mais je l'ai trouvé. Contrôles dans un ToolStripControlHost ne semblent pas se voir attribuer le BindingContext porté à travers un arbre de contrôle régulier.

Vous pouvez prendre soin de vous-même en ajoutant ce qui suit à la première ligne de votre méthode SetDataSource:

dataGridView1.BindingContext = this.BindingContext; 

Pour l'attribution équitable, j'ai eu l'idée de this web page, où une situation similaire a été rencontrée par rapport à un ComboBox. Je l'ai testé dans un exemple d'application avec votre code pour vérifier que cela fonctionne.

+0

merci monsieur, je vais essayer. – yonan2236

+0

Ça marche! hehe, je suis très reconnaissant, merci ...:) – yonan2236

+0

Nice. Mais quel est le concept derrière cela, c'est-à-dire derrière le comportement? – TheBlastOne

-3

Le simple changement de la source de données d'un contrôle ne lui dit pas de re-lier (rafraîchir) ses données à partir de cette nouvelle source de données. Vous devez exécuter la commande DataBind() du contrôle après avoir modifié sa source de données.

Alors après:

dataGridView1.DataSource = ds; 

essayez d'ajouter ceci:

dataGridView1.DataBind(); 
+0

Si je ne me trompe pas, le contrôle DataGridView n'a pas de propriété DataBind. Mais GridView a dans ASP.Net – yonan2236

+0

Oups. Désolé pour mon erreur Yonan. Je suis content que vous l'ayez fait fonctionner. – BluMunky

Questions connexes