2015-03-17 2 views
0

Je tente de supprimer des lignes d'une table via une zone de liste. Voici le code que j'ai utilisé pour afficher les données de la base de données dans la zone de liste. FYI - J'utilise une fonction de recherche de calendrier - par laquelle un utilisateur sélectionne une date sur le calendrier, clique sur 'recherche', et la zone de liste affiche les résultats appropriés en fonction des dates trouvées dans la base de données.C# suppression des entrées de la base de données via la zone de liste

Con.Open(): 
SqlCommand cmd = new SqlCommand("Select Member, Clerk, Room, Time From Events where Date = @searchDate", con); 
cmd.Parameters.AddWithValue("@searchDate",SearchDate.SelectedDate); 
IDataReader reader = cmd.ExecuteReader(); 

      while (reader.Read()){    
       string member = (string)reader["Member"]; 
       string clerk= (string)reader["Clerk"]; 
       string room = (string)reader["Room"]; 
       string time = (string)reader["Time"]; 
       lstEvents.Items.Add("Member: " + member + " -- " + "Clerk: " + clerk+ " -- " + "Room: " + room + " -- " + "Time: " + time);   
       //lstEvents is the ID of the listbox    
      } 
      reader.Close(); 
con.Close(); 

Le code ci-dessus fonctionne très bien. Ce que j'espérais, c'était de trouver un moyen de supprimer la ligne correspondante dans la base de données. Ainsi, un utilisateur sélectionne l'un des éléments retournés dans la liste et clique sur 'supprimer'. Je suis aussi loin que ...

SqlCommand cmd = new SqlCommand("Delete From Events where Member, Clerk, Room, Date, Time = @member, @clerk, @room, @date, @time", con); 
     cmd.Parameters.AddWithValue("@member", lstEvents.SelectedValue); 
     cmd.Parameters.AddWithValue("@clerk", lstAppointments.SelectedValue); 
     cmd.Parameters.AddWithValue("@room", lstEventss.SelectedValue); 
     cmd.Parameters.AddWithValue("@date", Convert.ToDateTime(SearchDate.SelectedDate); 
     cmd.Parameters.AddWithValue("@time", lstEvents.SelectedValue); 

     cmd.Connection = con; 
     cmd.ExecuteNonQuery(); 

Cette tentative semble cependant un peu farfelue, des suggestions comment cela pourrait se faire? Je ne comprends pas particulièrement comment je peux sélectionner plusieurs valeurs, à savoir un membre et un employé de la même ligne dans la zone de liste.

+1

Est-ce que ce tableau ont une carte d'identité? –

+0

oui, c'est un int qui est automatiquement mis à jour. –

Répondre

2

Lorsque vous chargez les lignes de la base de données, chargez également la clé primaire (même si vous ne l'affiche pas).

Lorsque vous supprimez quelque chose sélectionné dans votre zone de liste, vous pouvez simplement supprimer à l'aide de la clé primaire.

Si votre table ne dispose pas d'une clé primaire, les chances sont très bonnes que vous devez ajouter un.

+0

merci pour cela, je comprends un peu ce que vous suggérez. La base de données possède une clé primaire, c'est un int qui est automatiquement incrémenté de un. Ce que je luttais particulièrement avec était de savoir comment je peux extraire des éléments de l'élément sélectionné, par exemple. si je sélectionne une ligne dans la zone de liste, des idées comment je peux référencer la clé primaire liée à cette ligne? J'ai essayé et échoué avec de nombreuses tentatives:/ –

+0

Vous pouvez utiliser la propriété 'Tag' pour stocker l'ID https://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.tag(v= vs.110) .aspx –

0

Votre meilleur pari serait d'utiliser la liaison de données, c'est là, vous pouvez créer une liste d'objets qui a une carte d'identité. La meilleure façon de le faire serait de créer une nouvelle classe et lui donner les propriétés de la base de données:

public class MyClass 
{ 
    public int Id {get; set;} 
    public string Member {get; set;} 
    public string Clerk {get; set;} 
    public string Room {get; set;} 
    public string Time {get; set;} 
} 

Une fois que vous avez votre objet, vous pouvez « lier » à un contrôle ListBoxItem

ASP.NET: Listbox datasource and databind

une fois que vous avez réussi à lier votre objet liste à votre contrôle ListBoxItem, vous pouvez faire un code comme celui-ci à l'intérieur d'un événement bouton

MyClass selectedItem = (MyClass)yourcontrolname.SelectedItem; 
// do stuff with selectedItem.Id (like delete an entry from the database