2009-07-13 7 views
0

J'ai une application Windows Forms contenant un contrôle datagridview. Le datagridview est rempli par le contenu d'un fichier XML. À l'heure actuelle, toutes les colonnes sont affichées en tant que datagridviewtextboxcolumns. Je veux en sélectionner un qui est peuplé par une balise xml particulière et afficher son contenu dans une colonne datagridviewcombobox avec 2 autres options.C# Datagridview - Convertit TextColumn en ComboBoxColumn

Exemple:

<SMS> 
<Number>+447931663542</Number> 
<DateTime>2009-07-12T17:00:02</DateTime> 
<Message>YES</Message> 
<FollowedUpBy>Unassigned</FollowedUpBy> 
<Outcome>Resolved</Outcome> 
</SMS> 

La balise est la colonne ISSUE que je voudrais être affiché comme comboboxcolumn dans le datagridview. Si par exemple la balise est vide et ne contient aucune donnée, alors je ne veux rien afficher, mais j'ai la liste déroulante avec 3 options possibles à choisir (Non résolue, Résolue, En attente). Si toutefois la balise contient des données, je veux que cet élément particulier soit affiché dans la colonne de liste déroulante, et que les deux autres options soient disponibles.

Aider à réaliser cela serait grandement apprécié!

Cordialement,

EDIT: Actuellement, j'utiliser ce code:

 colOutcome = new DataGridViewComboBoxColumn(); 
     colOutcome.HeaderText = "Outcome"; 
     colOutcome.Width = 90; 
     colOutcome.Items.AddRange("Resolved", "Unresolved", "Pending"); 
     this.dataGridView1.Columns.Insert(1, colOutcome); 
     this.dataGridView1.Columns[1].Name = "OutcomeColumn"; 

Ce code au-dessus du combobox remplit. LE PROBLÈME EST: Lorsque le document xml remplit datagridview, la colonne des résultats apparaît comme une colonne de zone de texte, contenant les données entre les balises de résultats dans le fichier xml. Mon point est, comment puis-je obtenir le datagridview à réaliser quand il lit la colonne de résultat qu'il doit être changé dans une colonne de liste déroulante et puis afficher les données de cette façon, avec les autres options potentiellement sélectionnables dans la liste déroulante ?! Actuellement, datagridview est rempli avec toutes les colonnes comme textboxcolumns contenant les données, ainsi qu'une colonne de liste déroulante séparée qui n'est pas ce que je veux. J'ai besoin de l'application pour fusionner la colonne des résultats et ses données avec le code ci-dessus.

Des idées?

Répondre

0

Mise à jour Réponse

Vous pouvez passer dans le document XML à une fonction qui boucle à travers chaque noeud et déterminer si elle doit être ou non un ComboBox à savoir si le nom est « résultat ».

private void CreateColumns(XmlDocument doc) 
{ 
    foreach (...) // loop through each node in xml document 
    { 
     if (node.Name == "Outcome") 
     { 
       var items = new List<string>() { "Resolved", "Unresolved", "Pending" }; 
       this.dataGridView1.Columns.Add(CreateComboBoxColumn(node.Name, items)); 
     } 
     else 
     { 
       this.dataGridView1.Columns.Add(String.Format("col{0}", node.Name), node.Name); 
     } 
    } 
} 

Ensuite, votre code pour créer la colonne Résultat serait:

private DataGridViewComboBoxColumn CreateComboBoxColumn(string colHeaderText, List<string> items) 
{ 
    var colOutcome = new DataGridViewComboBoxColumn(); 
    colOutcome.HeaderText = colHeaderText; 
    colOutcome.Width = 90; 
    colOutcome.Items.AddRange(items.ToArray()); 
    colOutcome.Name = String.Format("col{0}", colHeaderText); 
    return colOutcome; 
} 

Vous appelleriez alors que CreateColumns sur l'événement de chargement de formulaire et passer dans votre XML. Vous devez seulement créer les colonnes une fois.

Mon conseil serait d'avoir une fonction similaire qui va trouver tous les éléments SMS et ajouter une nouvelle ligne en le peuplant avec les informations dans chaque nœud.

public void MyForm_Load(object sender, EventArgs e) 
{ 
    var doc = new XmlDocument(filename); 
    CreateColumns(doc); 
    CreateRows(doc); 
} 

Espérons que ça aide.

+0

D'où vient la référence CheckBoxColumn de? Soyez prudent avec ce code car il serait appelé sur chaque colonne dans le DataGridView qui est de type DataGridViewComboBoxCell. –

+0

Typo était censé être ComboBoxCell! Oui, il sera appelé sur chaque cellule qui est cliquée, mais sera seulement géré par les cellules qui sont ComboBoxCells. – James

+0

Je ne pense pas que je me suis expliqué correctement. Voir Modifier pour plus de détails ..... – Goober

0

Je ne suis pas assis devant VS, donc cela pourrait ne pas compiler mais devrait vous donner une direction.

Vous devez soit pré-remplir le ResolvedColumn avec les 3-4 valeurs possibles au moment de la conception, soit l'affecter à une autre source de données lors de l'exécution.Si vous avez choisi l'approche au moment du design, ouvrez simplement la boîte de dialogue "Edit Columns" de DataGridView, trouvez ResolvedColumn, allez dans Items et ajoutez vos valeurs ("", "Unresolved", "Pending", "Resolved"). La valeur vide peut aider le ComboBox à afficher s'il est possible de rendre la grille avec des enregistrements SMS qui n'ont aucun résultat.

Pour lier les options possibles lors de l'exécution de faire quelque chose comme ceci:

private List<string> _outcomeDataSource; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    _outcomeDataSource = new List<string>; 
    _outcomeDataSource.Add(""); 
    _outcomeDataSource.Add("Unresolved"); 
    _outcomeDataSource.Add("Pending"); 
    _outcomeDataSource.Add("Resolved"); 

    ResolvedColumn.DataSource = _outcomeDataSource; 
    ResolvedColumn.PropertyName = "Outcome"; 
} 
+0

votre déclaration de la liste est en VB.NET pas C#, devrait être privé Liste _outcomeDataSource – James

+0

Je ne pense pas que je me suis expliqué correctement. Voir Modifier pour plus de détails ...... – Goober

+0

@James, merci d'avoir attrapé ça. Je développe principalement en VB en raison des exigences du client, mais la question était en C# alors je convertissais le code dans ma tête. Je l'ai mis à jour pour refléter votre solution. –

0

Réponse # 2 pour moi, en fonction de la question mise à jour.

Le problème que vous rencontrez est avec la fonctionnalité AutoGeneratedColumns de DataGridView. Vous devrez créer vos colonnes manuellement avant la liaison de données. Cela peut être fait au moment du design ou de l'exécution. Je préfère le design car il vous donne un peu plus de sens avec l'aspect de la grille, mais de toute façon ça marche.

Vous devez désactiver la propriété AutoGeneratedColumns de la grille:

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Define your columns at run-time here if that's what you prefer 

    this.dataGridView1.AutoGeneratedColumns = false; 
    this.dataGridView1.DataSource = myDataSource; 
} 
Questions connexes