J'ai un tableaux de table et je veux faire quelque chose lorsque l'événement rampdé est tiré. Je ne peux pas comprendre où mettre le code pour ajouter le gestionnaire à l'événement.
Adapter.RowUpdated +=
new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);
8 Réponses :
Edit: Aucune des étapes suggérées ci-dessous est utile, apparemment. strong> Je garde cette réponse ici purement pour que quiconque essaie de répondre aux mêmes suggestions ne propose pas les mêmes suggestions. < / p>
Créez-vous le Si vous créez l'adaptateur explicitement dans votre code, ajoutez simplement l'appel vous-même. P>
Alternativement, votre classe partielle a-t-elle un constructeur qui est appelé? Encore une fois, si oui, vous pouvez ajouter l'appel là-bas. P>
Edit: D'accord, donc il est probablement utilisé dans une page ou une forme particulière - pouvez-vous l'ajouter après la méthode
TableAdapter Code> dans le concepteur? Si tel est le cas, pouvez-vous ne pas simplement cliquer sur la partie d'événements de la page de propriétés et tapez "OnRowUpdatedated" dans l'entrée RUNUPUPDATEDATED CODE>? P>
initializececomponent code> de cette page / formulaire? P>
J'utilise le concepteur pour créer un jeu de données tapé avec une table de données et un adaptateur de table. Il n'y a pas d'événement une partie de la page de propriétés que je peux voir. Comme le concepteur a créé un constructeur, je ne peux pas y ajouter dans la classe partielle.
@Simon: Je faisais référence au concepteur où vous êtes en utilisant i> l'adaptateur - c'est-à-dire le formulaire / quoi que ce soit où vous y comprendez. Pas le concepteur de données.
Je pourrais faire le public sur le gestionnaire ONROWUWUPDATED et utiliser ce code sur le formulaire: MyTableadapter MyAdapter = New MyTableadapter (); myadapter.adapter.rowupdated + = nouveau system.data.odbc.odbcrowuppdatedeventHandler (myadapter.onrowu a Pdated); Cependant, je préférerais faire cela dans la classe partielle de l'adaptateur afin que les utilisateurs de l'ensemble de données ne soient pas obligés d'ajouter ce code chaque fois qu'ils créent une instance de l'adaptateur.
Jon, il n'y a pas de volet «événements» sur la forme non plus.
Ok, on dirait que cette réponse n'est pas terriblement utile que ... modifiera pour le dire, mais laissez-la comme une liste de choses que nous avons essayées :)
Pour être plus spécifique @ 5: 00 minute Beth double clique sur le jeu de données et obtient un événement xxrowowchangeing
Cela a été un moment depuis que j'ai utilisé cette dernière utilisation, mais si je me souviens bien, vous devriez pouvoir remplacer endinit () code> dans votre classe partielle et ajouter le code init comme Ajout de votre gestionnaire d'événements là-bas ... p>
Supprimez l'endinitine Votre classe C # Classe et le gestionnaire d'événements de feu de là
public override void EndInit()
{
base.EndInit();
Adapter.RowUpdated +=
new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);
}
void OnRowUpdated(object sender, System.Data.Odbc.OdbcRowUpdatedEventArgs e)
{
}
La classe TableAdapter ne vous permet pas de remplacer l'endinit (pas de méthode appropriée trouvée à remplacer). La classe partielle de DataTable vous permet de remplacer l'endinit, mais je ne peux pas voir comment accéder à la table de table correspondante du jeu de données.
// Assumes that connection is a valid SqlConnection object.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT CustomerID, CompanyName FROM Customers", connection);
// Add handlers.
custAdapter.RowUpdating += new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated);
// Set DataAdapter command properties, fill DataSet, modify DataSet.
custAdapter.Update(custDS, "Customers");
// Remove handlers.
custAdapter.RowUpdating -= new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated -= new SqlRowUpdatedEventHandler(OnRowUpdated);
protected static void OnRowUpdating(
object sender, SqlRowUpdatingEventArgs args)
{
if (args.StatementType == StatementType.Delete)
{
System.IO.TextWriter tw = System.IO.File.AppendText("Deletes.log");
tw.WriteLine(
"{0}: Customer {1} Deleted.", DateTime.Now,
args.Row["CustomerID", DataRowVersion.Original]);
tw.Close();
}
}
protected static void OnRowUpdated(
object sender, SqlRowUpdatedEventArgs args)
{
if (args.Status == UpdateStatus.ErrorsOccurred)
{
args.Row.RowError = args.Errors.Message;
args.Status = UpdateStatus.SkipCurrentRow;
}
}
Les réponses sont meilleures quand elles sont accompagnées de explication i>, plutôt que simplement un mur de code.
J'ai résolu ceci en 2 étapes.
a. Ajoutez une classe partielle et étendez l'adaptateur de table p>
b. Appelez une méthode au début avant d'utiliser cet adaptateur (dire sous forme principale après avoir créé une instance de celle-ci). P>
Le code ci-dessous consiste à résoudre mon problème particulier avec SQL CE pour pouvoir mettre à jour des ID sur le tableau. Cependant, vous pouvez utiliser la méthode étendue pour envelopper l'événement rampdated et l'exposer à d'autres classes (c'est-à-dire myRowupDatedated) p>
l'extension p> l'appel dans le Forme principale: P> tableAdapter = new ScannedItemsTableAdapter();
tableAdapter.Fill(ds.ScannedItems);
tableAdapter.InitEvents();
C'est comme ça que j'ai résolu le problème, mais je cherchais un moyen de filer l'événement dans la classe d'adaptateur de table lorsque l'adaptateur de table est créé.
Merci. C'est comme ça que je me suis retrouvé aussi bien. Pour les futurs lecteurs, assurez-vous que vous appelez initevents () code> Une fois que votre objet adaptateur a été initialisé et non dans le constructeur de votre formulaire.
J'ai une alternative possible.
tandis que l'on peut s'abonner aux adaptateurs sous-jacents de tableaux de table dans la classe partielle de Tableadapter, je trouve que vous ne pouvez pas l'initialiser facilement sans avoir à vous rappeler d'appeler une initialisation de votre choix. p>
Cependant, j'ai trouvé que je peux vous abonner à un événement TableAdapters.Adapter.Adapterdated directement de l'intérieur du code à l'aide de la carte TableADPater comme indiqué ci-dessous P>
AddHandler Me.TA_Case_Transactions.Adapter.RowUpdated, AddressOf Transaction_Row_Written
Private Sub Transaction_Row_Written(p_Sender As Object, p_E As SqlRowUpdatedEventArgs)
beep
End Sub
Voici un moyen facile de le faire, en utilisant le designer. Cliquez avec le bouton droit de la souris sur le jeu de données (fichier .xsd) et sélectionnez Code Afficher le code. Tout comme avec une forme, il ne va pas ouvrir le code designer. Ça va ouvrir votre code. Voici votre code: dans votre formulaire, n'oubliez pas de p>
Si vous avez la chance de la mettre juste après la création CODE> Adapter CODE>, je l'installerais si vous avez une méthode
initializececomponent code> qui fait l'initialisation pour vous dans le conteneur Constructeur de classe Mettez le code juste après l'appel deinitializececomponent code>.J'ai mis une prime sur cette question parce que c'est un problème que j'ai eu régulièrement depuis les jours de .net 1.1 et je pense qu'il doit y avoir une meilleure solution à cela que de pirater l'adaptateur de table après l'instanciation.
Les solutions fournies dans les réponses sont pragmatiquement bonnes et techniquement saines.