Comment faire pour déterminer si DataGridView contient des modifications non validées quand il est lié à un SqlDataAdapter
J'ai un formulaire qui contient un DataGridView, un BindingSource, un DataTable, et un SqlDataAdapter. - Je remplir la grille et les liaisons de données comme suit:
private BindingSource bindingSource = new BindingSource();
private DataTable table = new DataTable();
private SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM table ORDER BY id ASC;", ClassSql.SqlConn());
private void LoadData()
{
table.Clear();
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = bindingSource;
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
bindingSource.DataSource = table;
}
L'utilisateur peut alors apporter des modifications aux données, et de commettre ces changements ou de les annuler en cliquant sur enregistrer ou le bouton annuler, respectivement.
private void btnSave_Click(object sender, EventArgs e)
{
//save everything to the displays table
dataAdapter.Update(table);
}
private void btnCancel_Click(object sender, EventArgs e)
{
//alert user if unsaved changes, otherwise close form
}
Je voudrais ajouter une boîte de dialogue si vous cliquez sur annuler, qui prévient l'utilisateur des modifications non enregistrées, si des modifications non enregistrées existent.
Question:
Comment puis-je déterminer si l'utilisateur a modifié des données dans le DataGridView mais pas validée dans la base de données? Est-il un moyen facile de comparer l'état actuel de DataGridView données par le dernier extrait de la requête? (Notez qu'il n'y aurait pas d'autres threads ou les utilisateurs de modifier les données dans SQL en même temps.)
OriginalL'auteur JYelton | 2010-05-11
Vous devez vous connecter pour publier un commentaire.
Afin de détecter les changements dans le DataGridView, je me suis retrouvé à l'aide de deux événements, l'
CellValueChanged
etCurrentCellDirtyStateChanged
(le dernier en raison de type case à cocher colonnes).Lorsque l'un de ces événements se produit, j'ai mis un booléen (UnsavedChanges) pour indiquer l'objet de modifications. Lorsque le formulaire est fermé ou si le bouton annuler (maintenant renommé "Revenir") est cliqué, le booléen est cochée et que la boîte de dialogue affichée si la valeur est true. Si le bouton "enregistrer" est cliqué, le booléen est défini à false, et les données enregistrées.
Bien que pas aussi simple que de vérifier une propriété de la liaison de données ou de contrôle datagrid, il fonctionne comme souhaité.
OriginalL'auteur JYelton
Cela peut être une question stupide, mais pourquoi ne serait-ce pas le travail?
pour VB
pour C#
Si votre datatable est lié par l'intermédiaire d'un bindingsource à votre datagridview puis récemment modifié mais non validée modifications sont à traîner dans votre datatable. Des ensembles de données et les tables de données ont un
GetChanges()
méthode qui peut faire le dur travail d'examen et de retour pour vous exactement ce qui a été édité et rien de plus et fonctionnent en conséquence.OriginalL'auteur TWood
Eh bien, je suis à Jouer autour d'un truc, j'espère que ça aidera à vous tous, je suis le suivi de l'évolution à l'aide de bindingsource est CurrentItemChanged méthode. Ici, j'ai utilisé la propriété tag de datagridview pour signaler les modifications, vous pouvez utiliser une variable:
Rappelez-vous, ce déclencheur peut être tiré plusieurs fois, donc à la fois si des instructions de contrôle de l'exécuter une fois, vraiment. Enfin, vous pourriez ce code à la sortie gestionnaire de bouton, comme dans mon cas le code est ici:
Sur Annuler les Modifications, de réinitialiser l'indicateur. Espérons Que Cela Fonctionne Pour Vous, Trop.
Ce qui concerne
OriginalL'auteur qbaloch
lorsque vous traitez avec petite table avec dataset tout ne voulez pas avoir affaire avec la cellule événement de changement et d'annuler, de modifier, on pourrait utiliser une certaine amélioration de la variante de:
OriginalL'auteur gg89