2010-02-10 2 views
0

J'ai besoin d'aide pour gérer les clics sur les boutons dans un élément de répéteur ASP.NET lorsque l'enregistrement sur lequel l'élément est basé est identifié par un point primaire clé couvrant plusieurs colonnes.Comment gérer les clics sur un bouton lorsque vous utilisez un répéteur avec une clé primaire formée de plusieurs colonnes

Les arrière-plans:

La page dont je parle va chercher un Complaint, qui est un objet avec des propriétés, de la base de données et affiche ses propriétés à l'utilisateur. L'une de ces propriétés est Escalations, qui est un objet System.Collections.Generic.List<Escalation>.

L'objet Escalation est simplement une représentation en code de la table SQL suivante:

create table [escalations] 
(
    [complaint_id] int not null, 
    [escalation_group_id] varchar (50) not null 
    [escalation_date] datetime not null, 
    [escalation_text] text not null, 
    [response_date] datetime null, 
    [response_text] text null, 

    constraint [pk_escalations] primary key ([complaint_id], [escalation_date]), 
    constraint [fk_complaints] foreign key ([complaint_id]) references [complaints].([complaint_id]), 
    constraint [fk_escalation_groups] foreign key ([escalation_group_id]) references [escalation_groups].([escalation_group_id]) 
) 

Pour afficher la liste des Escalations je choisis d'utiliser un System.Web.UI.WebControls.Repeater, parce que je besoin d'une mise en page complexe, donc je suis avec le code suivant (c'est une version dépouillée du code réel pour améliorer la lisibilité, par exemple le « Répondre à cette plainte » pièce est placée dans une fenêtre pop-up modal, il y a des validateurs et ainsi de suite):

<h2>Complaint #<asp:literal id="complaint_id" runat="server" /></h2> 

<asp:repeater id="escalations" runat="server"> 
    <itemtemplate> 
     <h3>Escalation date</h3> 
     <p><%# DataBinder.Eval(Container.DataItem, "complaint_date", "{0:yyyy-MM-dd}") %></p> 

     <h3>Complaint text</h3> 
     <p><%# DataBinder.Eval(Container.DataItem, "complaint_text") %></p> 

     <asp:panel id="response_panel" visible='<%# DataBinder.Eval(Container.DataItem, "response_date") == null ? false : true %>' runat="server"> 
      <h3>Response date</h3> 
      <p><%# DataBinder.Eval(Container.DataItem, "response_date", "{0:yyyy-MM-dd}") %></p> 

      <h3>Response text</h3> 
      <p><%# DataBinder.Eval(Container.DataItem, "response_text") %></p> 
     </asp:panel> 

     <asp:panel id="reply_panel" visible='<%# DataBinder.Eval(Container.DataItem, "response_date") == null ? true : false %>' runat="server"> 
      <h3>Reply to this complaint</h3> 
      <p><asp:textbox id="complaint_response" textmode="multiline" runat="server" /></p> 
      <p><asp:button id="send_response" text="Send response" onclick="SendResponse" runat="server" /></p> 
     </asp:panel> 
    </itemtemplate> 
</asp:repeater> 

Lorsque le l'utilisateur clique sur le bouton send_response, je dois mettre à jour le Escalation correspondant, et je suis à la perte sur la façon d'identifier le bon.

protected void SendResponse(Object sender, EventArgs e) 
{ 
    // ?!?! 
} 

Obtenir le complaint_id est pas un gros problème, je peux l'enregistrer dans le ViewState car il est le même pour tous les Escalation.

Si le Escalation aurait été identifié par une clé primaire construite sur une seule colonne, je aurait pu préciser un CommandArgument sur le bouton send_response, cependant, puisque la clé primaire est formée par les colonnes complaint_id et escalation_date, il est impossible de fais le.

J'ai même trouvé autour des solutions impliquant la délimitation des champs à des contrôles comme System.Web.UI.WebControls.Label ou System.Web.UI.WebControls.Literal, mais comme le terrain, je dois passer un DateTime, je ne sais pas comment le gérer.

La question (s):

Il est possible d'identifier - quand la méthode SendResponse - la Escalation correcte? Si oui, comment puis-je le faire? Si ce n'est pas viable, comment puis-je changer la façon dont j'affiche les données?

Si quelqu'un est désireux de lire les sources réelles, voici le ASPX code et voici le C# code, mais je dois vous avertir: les classes et propriétés personnalisées, les noms de méthodes et ainsi de suite sont en italien.

Merci d'avance, Andrea.

Répondre

1

Vous pouvez utiliser l'événement Command de la propriété Button et CommandArgument comme vous le décrivez, mais créer une propriété en lecture seule sur votre objet d'escalade qui renvoie une concaténation de la clé primaire conjointe. Liez cette propriété à CommandArgument du bouton.

Si vous ne pouvez pas ou ne voulez pas créer une propriété en lecture seule, vous pouvez écrire une méthode simple dans le code-behind pour construire la concaténation, et l'appeler à partir de la méthode Eval, par ex.

<asp:Button ... 
    CommandArgument='<%# ConcatenatePrimaryKeys(Eval("complaint_id"), Eval("escalation_date")) %>' 
    runat="server" /> 
+0

Eh bien, cela semble une solution parfaitement logique que j'ai complètement raté ... – Albireo

Questions connexes