2009-01-08 6 views
2

J'ai un contrôle gridview lié à une source de données d'objet. en plus des colonnes que je veux afficher je veux afficher ceasp: CheckBoxField dans GridView - VS 2008

<Columns> 
     <asp:CheckBoxField DataField="Locked" Visible="true" AccessibleHeaderText="On Hold" ReadOnly="false"/> 
</Columns> 

quelques questions ici: 1. Si je fais ce qui précède dit, mes charges de page et certaines lignes ont leurs dossiers marqués comme vérifiés et certaines lignes ne le font pas, selon les données. Toutefois, l'utilisateur ne peut pas cliquer sur les enregistrements pour annuler leurs coche. Il semble que ce soit dans un état désactivé.

  1. Il semble qu'il n'y ait pas d'événement onclick avec cette case à cocher. Je veux mettre à jour mes enregistrements instantanément lorsque l'utilisateur vérifie ou décoche chaque enregistrement. oui une mauvaise conception ici, mais mes mains sont liées

  2. Si je devais aller avec <asp:checkbox> dans un <itemtemplate> comment puis-je lie que ma colonne verrouillée au sein de la source de données objet ou dois-je faire cela par overiding onne des méthodes du contrôle gridview?

+0

Vous ne pouvez pas utiliser l'événement OnCheckChanged? –

Répondre

0

Pour l'événement Click, je ne pouvais pas non plus comprendre OnClickChange, donc j'ai roulé le mien. En ce qui concerne la base de données et la mise à jour, je me suis contenté de la gérer moi-même sur GridRowCommand.

0

Votre contrôle est bloqué car GridView vous permet uniquement de modifier une ligne si la ligne est en mode Modifier. Je pense que ce que vous cherchez vraiment est une case à cocher définie dans un TemplateField. Ensuite, vous pouvez définir la valeur initiale « cochée » dans le code derrière ou en faisant quelque chose comme:

<asp:CheckBox ID="MyCheckBox" runat="server" Checked='<%#Eval("Locked")' ... /> 

Quant à la détente, vous pouvez pointer la propriété OnCheckedChange à la fonction de votre choix, mais je suis Je ne sais pas comment vous diriez quelle ligne a été vérifiée.

Une meilleure alternative pourrait être d'utiliser le contrôle Button ou ImageButton pour faire la même chose. De cette façon, vous pouvez remplir le CommandArgument avec l'ID de ligne ou tout ce dont vous avez besoin et vous y aurez accès lorsque vous gérez le RowCommand de GridView.

4

Pour répondre # 2, j'irais avec un contrôle <asp:CheckBox> dans le <ItemTemplate> puis définissez la propriété Checked en cas GridView_RowDataBound:

protected void grdSomething_RowDataBound (Object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     BusinessObject data = (BusinessObject) e.Row.DataItem; 
     CheckBox chkLocked = (CheckBox) e.Row.FindControl("chkLocked"); 
     chkLocked.Checked = data.Locked; 
    } 
} 

Quant à la question n ° 1, une solution que je l'ai utilisé Par le passé, avec de bons résultats, l'événement onClick côté client du <asp:CheckBox> appelle une méthode de page asynchrone ASP.NET Ajax (essentiellement un service Web privé) qui met à jour l'objet métier approprié. Cela ne serait pas l'approche la plus simple pour vous, mais l'expérience de l'utilisateur est assez simple (pas de publication de page pleine page):

Vous auriez besoin d'une méthode statique dans votre fichier code-behind pour mettre à jour l'objet métier approprié. Quelque chose comme (ce qui est assez rude):

[WebMethod] 
public static void ToggleLockedStatus (string key) 
{ 
    if (BusinessObjectDictionary.ContainsKey(key)) 
    { 
     BusinessObjectDictionary[ key ].Locked = !BusinessObjectDictionary[ key ].Locked; 
    } 
    else 
    { 
     throw new Exception("The business object specified was not found."); 
    } 
} 

Pour plus de détails sur la façon de le faire avec ASP.NET Ajax, check out MSDN here.