2010-10-04 3 views
0

Je tente de créer un calendrier qui est simplement une interface utilisateur simple pour afficher les dates et les dates des utilisateurs de notre système. J'ai remplacé l'événement "DayRender" du calendrier pour accéder à chaque cellule, puis insérer un couple de contrôles dynamiques pour afficher des données spécifiques. L'affichage des commandes fonctionne très bien. Cependant, j'ai récemment voulu ajouter un LinkButton avec des arguments de commande et capturer l'événement pour exécuter une autre logique et changer l'interface utilisateur. Le LinkButton est correctement affiché et s'affiche comme un simple "" avec l'ID affecté. Cependant, cliquer sur le lien ne fait rien et il semble que la partie normale "href = '... javascript action ...'" du lien ne soit pas générée. J'ai le sentiment que tout cela est dû au fait que j'ajoute le contrôle à l'étape du rendu du jour dans le cycle de vie de la page. Mais si c'était le cas, le contrôle ne se montrerait probablement pas du tout.Calendrier, Dynamic LinkButton Aide CommandEventHandler

Des idées sur pourquoi l'action de clic n'est pas encore ajouté le texte et tout le reste sont? Le code est ci-dessous.

Merci pour votre temps

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) 
    { 
     if (Schedule != null) 
     { 
      var dayReq = from day in Schedule 
         where day.RequiredDate == e.Day.Date 
         where day.RequiredQty != 0 
         select day; 

      if (dayReq.FirstOrDefault() != null) 
      { 
       //Open the Date 
       e.Cell.Controls.Add(new LiteralControl("<br /><div class=\"auth-sched-req\">Req Qty: <strong>" + String.Format("{0:#,#.###}", dayReq.FirstOrDefault().RequiredQty) + "</strong><br />Prom Date: ")); 

       //Create a link button for the promise date 
       LinkButton lb = new LinkButton(); 
       lb.ID = dayReq.FirstOrDefault().ItemId.ToString(); 
       lb.Text = dayReq.FirstOrDefault().RequiredDate.ToShortDateString(); 
       lb.CommandName = "ShowPromise"; 
       lb.CommandArgument = dayReq.FirstOrDefault().ItemId.ToString(); 
       lb.Command +=new CommandEventHandler(lb_Command); 
       e.Cell.Controls.Add(lb); 

       //Close the Date 
       e.Cell.Controls.Add(new LiteralControl("</div>")); 
      } 
     } 
    } 

    protected void lb_Command(Object sender, CommandEventArgs e) 
    { 
     //Do some magic here 
     Response.Write(e.CommandArgument.ToString()); 
    } 

Répondre

0

essayer cette

<script type="text/javascript"> 
    function calendarClick(day) { 
     document.getElementById('<%= hfValue.ClientID %>').value = day; 
     document.getElementById('<%= ghostButton.ClientID %>').click(); 
    } 
</script> 
<asp:Button ID="ghostButton" runat="server" Style="display: none" OnClick="ghostButton_Click" /> 
<asp:HiddenField ID="hfValue" runat="server" /> 
Code

derrière:

protected void Calendar1_DayRender(object sender, DayRenderEventArgs e) 
{ 
    // ... 
    e.Cell.Attributes["onclick"] = string.Format("calendarClick({0})", dayReq.FirstOrDefault().ItemId.ToString()); 
    // ... 
} 
protected void ghostButton_Click(object sender, EventArgs e1) 
{ 
    string value = hfValue.Value; 
    // ... 
} 
+0

Cela ressemble beaucoup à un travail autour. Oui, cela me donnerait probablement ce que je veux, mais pourquoi le serveur ne génère-t-il pas automatiquement le lien comme il est supposé le faire? Je voudrais vraiment comprendre pourquoi ce que j'ai (basé sur docs MSDN) ne fonctionne pas. –

+0

(je crois) vous ne pouvez pas câbler des événements pendant le rendu. vous devez le faire avant. – y34h

0

Vérifiez si AutoEventWireup est définie sur true à savoir

AutoEventWireup="true" 
0

J'ai fini par suivre une autre route avec cette demande. Aucune des solutions proposées n'a fonctionné et je n'ai jamais pu le faire fonctionner. Une option que nous avons examinée était la création d'une table personnalisée pour construire le contrôle. Nous avons fini par changer où l'information a été changée et juste utilisé le contrôle de calendrier en tant que mécanisme d'affichage.

Désolé pour le retard!