2011-08-17 3 views
0

Je souhaite ajouter un nouvel élément à mon affichage DataGrid. Je sais peut réaliser cela en utilisant plusieurs TextBox et un bouton. Lorsque l'utilisateur clique sur ce bouton, il ajoute un nouvel élément dans la base de données et actualise ma vue de données.C# Winform DataGridView inline add Nouvelle ligne

Je me demande si je peux utiliser la dernière ligne de mon datagridview pour ajouter un nouvel élément. Comment puis je faire ça?

Répondre

2

avez-vous utilisé le RAD-Databind (DataSource sur vos winforms)? Si c'est le cas, cela pourrait être un peu difficile. Vous devez charger les données dans un calque séparé (pas dans le code-behind si vous pouvez l'aider). Ensuite, il devrait être plutôt simple d'ajouter une autre ligne dans vos données locales.

Comme vous l'avez demandé: voici un exemple très simple. J'utilise les mêmes données génériques:

public struct SimpleData 
{ 
    public int Id { get; set; } 
    public string Text { get; set; } 
} 

et initialiser un DataGridView nommé GridView via:

 var bindingSource = new BindingSource(); 
     bindingSource.Add(new SimpleData {Id = 1, Text = "Hello"}); 
     bindingSource.Add(new SimpleData {Id = 2, Text = "World"}); 
     GridView.DataSource = bindingSource; 

vous pouvez ajouter une autre ligne simplement en

 var data = GridView.DataSource as BindingSource; 
     data.Add(new SimpleData{Id=3, Text="!!! added"}); 

Dans un exemple du monde réel I utiliserait un modèle bien connu: MVVM for Winforms ou MVP for Winforms séparer la vue de la logique. Mais après tout, le bit important utilise une sorte de Bindingsource (qui informe la Grid que les données ont changé) ou réassigne les données modifiées au DataSource si vous choisissez d'utiliser un datacontain peu profond/simple comme List ou similaire.

+0

Merci pour votre réponse. Avez-vous un code d'exemple? – user609511

+0

BTW: dans mon code, je la logique "connaît" la vue - normalement, vous ne voulez pas cela, il suffit de le lire comme une démo. Dans le * MVVM-pattern * mentionné ci-dessus, vous exposeriez BindingSource dans votre ViewModel et la vue (peut-être dans votre code-behind) se lierait à ceci. – Carsten

+0

Merci pour votre réponse. J'ai oublié de vous dire que j'utilise 3Layer. DAL (INSERT INTO ... UPDATE ...). BAL, et Voir. Comment puis-je récupérer la valeur de chaque nouvelle ligne ou ligne CHANGE pour la connecter à mon DAL? – user609511

0

Ou,

Vous pouvez lier votre DataGridView à un Generic.List de WrapperObject (ou tout ce que vous voulez appeler la classe), où chaque instance de WrapperObject peut représenter soit l'un des enregistrements déjà dans la base de données et exposer ses propriétés, ou représenter un «enregistrement vide».

Dans le gestionnaire d'événements EditingControlShowing pour DataGridView, vous pouvez déterminer si l'utilisateur saisit la dernière ligne (car il s'agit de la seule ligne contenant la partie vide) et faire tout ce que vous devez faire pour ajouter une partie à la base de données. Lorsque vous souhaitez mettre à jour le contenu de DataGridView, recréez simplement une nouvelle liste d'objets WrapperObjects à partir des enregistrements que vous souhaitez afficher et ajoutez-en un pour représenter l'enregistrement vide à la fin, afin qu'il apparaisse à En bas, définissez la source de données DataGridView sur la nouvelle liste.

Questions connexes