C#, Control, header et datagrid !

J’ai cree un datagrid avec un Control “check All” dans le header du datagrid:

asp:TemplateColumn

<asp:CheckBox ID=“CheckAll” Runat=“server”></asp:CheckBox>

Dans mon code C#, je n’arrive pas a recuperer ce control Checkbox pour remettre la proprietes Checked a false quand je rafraichis le datagrid.

J’ai vu des solutions mais trop complexes a on gout (creation de ma propre classe herite de Datagrid, etc) , je suis sur qu’il existe une solution simple (enfin j’espere !)

Merci de me donner un coup de main !

Tu peux esssayer de rajouter
protected System.Web.UI.WebControls.CheckBox CheckAll;
dans tes variables, et si c’est le bon type (j’utilise pas les controles <asp:) tu vas pouvoir y acceder direct (asp.net va automatiquement la lier a celle sur ta page).

bien tente, mais non , ca ne marche pas :stuck_out_tongue:

Edit: l’objet ne s’initialise pas.

Tu as essayé du côté de la propriété .Controls de ton objet datagrid ? Sinon il existe une méthode sur ton this (Page) pour chercher un contrôle à partir de son ID (il me semble).

Réponse de mémoire, donc susceptible de ne pas être rigoureusement exacte :stuck_out_tongue:

bonne idee mais ca marche pas:

[quote]foreach(Control o in DatagridCriterias.Controls)
{
  checkBoxCriteria = (CheckBox) o.FindControl(« CheckAllCriteria »);
  if (checkBoxCriteria != null)
  {
    checkBoxCriteria.Checked = checkAll;
    break;
  }
}[/quote]

j’ai tente aussi de changer DatagridCriterias par this mais sans succes… :stuck_out_tongue:

[quote]checkBoxCriteria = (CheckBox) this.FindControl(« CheckAllCriteria »);
if (checkBoxCriteria != null)
{
  checkBoxCriteria.Checked = checkAll;
}[/quote]

ca non plus :stuck_out_tongue: :stuck_out_tongue:

J’ai cherché un peu à la va-vite, je n’ai rien trouvé de concluant, hormis cet article de codeproject où le mec utilise un javascript.

Hop, finalement j’ai trouvé un moyen :

[code]// Récupère le template de la colonne 0 (qui contient le checkbox)
(TemplateColumn)template = myDataGrid.Columns[0];

// Indique au template que les contrôles doivent être instanciés dans le conteneur global (Page)
template.HeaderTemplate.InstantiateIn(this);

// La méthode FindControl fonctionne désormais
CheckBox myCheckBox = this.FindControl(“CheckAll”);[/code]

Testé chez moi avec succès (beta2 mais j’ai vérifié ca existe aussi en v1.1)

j’ai teste ca dans la fonction page_load

[quote]TemplateColumn tc = (TemplateColumn) DatagridCriterias.Columns[0];
tc.HeaderTemplate.InstantiateIn(this);[/quote]

puis la ou il fallait j’ai mis:

[quote]checkBoxCriteria = (CheckBox) this.FindControl (« CheckAllCriteria »);
checkBoxCriteria.Checked = false;[/quote]

A l’affichage de la page, ca me donne:

[quote]Control ‹ CheckAllCriteria › of type ‹ CheckBox › must be placed inside a form tag with runat=server.

[HttpException (0x80004005): Control ‹ CheckAllCriteria › of type ‹ CheckBox › must be placed inside a form tag with runat=server.]
  System.Web.UI.Page.VerifyRenderingInServerForm(Control control) +152
  System.Web.UI.WebControls.CheckBox.Render(HtmlTextWriter writer) +40
  System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
  System.Web.UI.Control.RenderChildren(HtmlTextWriter writer) +72
  System.Web.UI.Control.Render(HtmlTextWriter writer) +7
  System.Web.UI.Control.RenderControl(HtmlTextWriter writer) +243
  System.Web.UI.Page.ProcessRequestMain() +1929[/quote]

le code ne plante pas, c’est lors de l’affichage de la page que ca merde, pourtant, le tag runat=« server » est bien la et je ne me suis pas trompe dans le nom de la checkbox… :stuck_out_tongue:

help ! :stuck_out_tongue:

Ok, j’ai la même erreur… La solution ne doit pas être la bonne donc, il va falloir chercher un autre moyen.

Quelque part tu me rassure, lol :stuck_out_tongue:

Glop est en vacance ? bah sinon ca serait cool qu’il puisse passer par ici pour eventuellement nous donner son avis a defaut d’une solution :P" :stuck_out_tongue:

Bon, j’ai regardé vite fait, en fait j’ai l’impression qu’il ne reste que 2 solutions :

  • Tu as vraiment besoin d’avoir un controle dans le header de ta colonne, tu fais une classe qui implémente ITemplate et tu l’utilises en codebehind pour gérer l’affichage de ta colonne.

  • Un simple javascript peut faire l’affaire (par ex. si tu veux faire le coup de la checkbox pour cocher toutes les checkbox de la colonne, comme je le soupçonne), et dans ce cas pourquoi se priver ? Surtout que j’ai trouvé qq exemples assez facilement sur google si programmer du js t’embête.

Joker : j’ai loupé qq chose peut-être…

J’utilise deja du javascript pour cocher/decocher toutes les cases et ca ca marche au poil.

Ce que je fais lors du chargement de la page, c’est que je recupere dans un BD les cases qui doivent etre cochees ou decochees et donc je coche et decoche les bonnes checkbox de mon tableau dans le code C# de la page.

La cerise sur le gateau aurai ete que je coche aussi celle qui est dans mon header lorsque je m’appercois par exemple que toutes les checkbox sont cochees :stuck_out_tongue:

Alors je pourrai faire un truc barbare en javascript qui tel un bourrin de viking pourrai a chaque refresh de la page scrutter le formulaire et verifier toutes les checkbox pour cocher celle qui s’appelle « CheckAll » quand il faut.
Mais j’aime pas les methode de vikings :stuck_out_tongue:

1 / Solution sale : une datagrid génère une table et donc par déduction dans la hierarchie … mais bon c’est carrement dégeux comme méthode

2 / Solution propre :

[code]public class MaSuperPage : System.Web.Page
{
// On déclare un champ privé
private CheckBox CheckAll;

// On rajoute un event handler sur l’évènement ItemCreated de la Datagrid

this.DataGrid1.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemCreated);
//…

// Dans l’Event Handler on récupère la checkbox
private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
 CheckAll = (CheckBox) e.Item.FindControl(“CheckAll”);
}
}[/code]
Bon courage !

[quote name=‘Vko’ date=’ 26 Apr 2005, 16:26’]2 / Solution propre :
…[/quote]
Oui, c’est bien, mais j’ai envie de dire que tu es en train de définir une datagrid spécialisée avec un checkall qui fait bel et bien partie de la grid et de rien d’autre, donc la solution vraiment propre (et qui simplifie le code) est de faire une CheckDataGrid : DataGrid qui expose un bool CheckAll et qui a une valeur par défaut pour la headerTemplate qui contient la checkbox (ça se fait en créant un classe qui implémente ITemplate). Ça peut te permettre de tout mettre dans un truc réutilisable, javascript compris…

Oui si tu veux faire un truc un peu plus porteur c’est clair que redéfinir une DataGrid est largement la meilleur solution :stuck_out_tongue:

la solution de me refaire une datagrid gerant le control est bien trop complexe pour moi qui debute a peine le C#

mais je tiens a remercier Vko pour sa solution « crade », elle fonctionne !!! :stuck_out_tongue:

Merci !