IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

CheckBoxField, datafield et booléen


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut CheckBoxField, datafield et booléen
    Bonjour à tous,

    je bosse sur un Gridview avec un ObjectDataSource et je veux créer une colonne CheckBoxField destiné à représenter sous forme de case à cocher la valeur d'un booléen "Published" mais ma base de donnée est Oracle et le type booléen n'existe pas, nous avons opté pour un "int" avec vérification systématique de valeur à o ou 1.
    J'ai donc fait pointer la propriété DataField de ma CheckBoxField sur la colonne "published":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <asp:GridView ID="GridViewWorflowsPublishing"  runat="server" 
            AutoGenerateColumns="False" EnableViewState="False" 
                DataSourceID="ObjectDataSourceGridViewPublishing" DataKeyNames="id_wf" >
        <Columns>
         <asp:CommandField ButtonType="Image" 
                CancelImageUrl="~/ressources/gif/CancelRow.gif" 
                EditImageUrl="~/ressources/gif/EditRow.gif" ShowEditButton="True" 
                UpdateImageUrl="~/ressources/gif/ValidateRow.gif" />
                <asp:BoundField DataField="id_WF" SortExpression="id_WF" ReadOnly="True" HeaderText="id_WF" Visible="true"></asp:BoundField>
                <asp:BoundField DataField="name" SortExpression="name" ReadOnly="True" HeaderText="Name"></asp:BoundField>
                <asp:BoundField DataField="published" SortExpression="name" HeaderText="Published" Visible="true"></asp:BoundField>
            <asp:CheckBoxField DataField="published" />
    ...ETC....
    Mais j'ai une erreur car le type de mon champ DataField n'est pas le booléen attendu, forcément, alors comment faire?
    Je peux caster mon int en bool directement dans l'asp?
    Comment faire?
    Quelqu'un a une astuce pour utiliser une checkboxfield avec des requêtes oracle?

    A l'aide !!!

    Merci à tous,
    Gaëlle.

  2. #2
    Membre chevronné Avatar de Redouane
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    435
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 435
    Par défaut
    Bonjour;

    Tu peux par exemple travailler avec <asp:TemplateField>, au lieu de travailler directement avec CheckBoxField, ça te permet d'utiliser le contrôle Checkbox.
    Dans ce cas t'auras qlq chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <asp:TemplateField>
                            <ItemTemplate>
                                <asp:CheckBox ID="cbPublished" runat="server" Checked='<%# Eval("published").ToString() == "1" ? true:false %>' />
                            </ItemTemplate>
                        </asp:TemplateField>
    bonne courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut
    Merci redouane pour ton aide!

    Si j'utilise un <asp:TemplateField> directement, je pourrais afficher sous forme de checkbox de mon champ "published" mais en mode édition, si par exemple mon user décoche la checkbox (bool : 1->0), comment l'information va être prise en compte au niveau du ObjectDataSource ?
    En résumé, ca va marcher et mettre à jour la base avec la nouvelle valeur?

    J'avais essayé de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <asp:TemplateField HeaderText="Published">
                <ItemTemplate>
                <asp:CheckBox ID="CheckBoxPublished" Enabled="false" Checked='<%# Convert.ToBoolean(Convert.ToByte(Eval("published"))) %>' runat="server" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:CheckBox ID="CheckBoxPublished" AutoPostBack="true" OnCheckedChanged="CheckBoxPublished_CheckedChanged" Checked='<%# Convert.ToBoolean(Convert.ToByte(Eval("published"))) %>' Enabled="true" runat="server" />
                </EditItemTemplate>
            </asp:TemplateField>
    Avec en code behind la méthode suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            protected void CheckBoxPublished_CheckedChanged(object sender, EventArgs e)
            {
     
                    CheckBox checkbox = (CheckBox)sender;
                    GridViewRow row = (GridViewRow)checkbox.NamingContainer;
     
                    if (checkbox.Checked == true)
                    {
                        row.Cells[3].Text = "1";
                    }
                    else
                    {
                        row.Cells[3].Text = "0";
                    }
            }
    Mais cela ne marche pas, la nouvelle valeur du texte de la cellule n'est pas effective, le ObjectDataSource ne prend pas la nouvelle valeur du texte de la cellule.
    Et en plus, pour une raison que je ne comprends pas, je passe deux fois dans CheckBoxPublished_CheckedChanged mais ce n'est pas mon problème immédiat!

    En fait, j'aimerai binder aussi ma CheckBox à la valeur du champ "published" en lecture ET en écriture.

    Une idée?
    Je craaaaaaque, une journée là-dessus, incroyable

    Merci pour votre aide,
    Gaëlle.

  4. #4
    Membre confirmé
    Profil pro
    Responsable informatique
    Inscrit en
    Mars 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 112
    Par défaut
    Bonjour Yuna,

    J'en ai galérais aussi mais avec SQL Server, mon erreur vennait de la conception de la BD.
    Les champs booléens étaient déclarés avec l'option NULL ce qui fais que CheckBox n'arrivait a inetrprétter la valeur NULL.

    Après correction dans des ces champs je n'ai puls ces problèmes.

    avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [R25_Envoye] [bit] NULL
    au lieu de, car un booléen prend vrai ou faux. AMHA!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [R25_Envoye] [bit] NOT NULL DEFAULT 0
    Juste une suggestion, si tu essaies input juste pour voir!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <input id="iptCheckBox" type="checkbox" runat="server" />
    Question bête, comment déclare-t-on un champ booléen dans Oracle'

    A+

  5. #5
    Membre chevronné Avatar de Redouane
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    435
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 435
    Par défaut
    Bnj,

    si on prend en compte que l'id de ton checkbox est cbPublished :

    Dans ton GridView, tu peux ajouter l'event RowCreated et dans le code behind, assigner pour chaque checkbox un EventHandler comme suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
        {
            CheckBox cbPublished = (CheckBox)e.Row.FindControl("cbPublished");
     
            if (cbPublished != null)
                cbPublished.CheckedChanged += new EventHandler(cbPublished_CheckedChanged);
        }
    PS : l'event handler cbPublished_CheckedChanged ici et comme le tien "CheckBoxPublished_CheckedChanged"

    Maintenant, pour l'évenement en question, tu peux récupérer l'id de la ligne dont tu veux faire la mise à jour, appeler la méthode de mise à jour ou faire d'autre traitements pour cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    private void cbPublished_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox cbPublished;
            string Message = string.Empty ;
     
            foreach (GridViewRow r in GridView1.Rows)
            {
                cbPublished = (CheckBox)r.FindControl("cbPublished");
     
                if (cbPublished.Checked)
                    //faire des traitements, comme récupérer un id ou appeler une fonction de mise à jour
                    Message = String.Format(@"Id sélectionné: {0}",
                                    ((Label)r.FindControl("TonId")).Text);
     
            }
     
            //juste pour exemple
            Response.Write(Message);
     
        }
    TonId dans cet exemple est un label, qui affiche l'id de l'elément courant (la ligne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      <asp:TemplateField>
                            <ItemTemplate>
                                <asp:Label ID="TonId" runat="server" Text='<%# Eval("ID_WF") %>'></asp:Label>
                            </ItemTemplate>
                        </asp:TemplateField>
    et n'oublie pas d'activer l'AutoPostBack pour le checkbox en question pour qu'il rafraiche la page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:CheckBox ID="cbPublished" runat="server" AutoPostBack="true" ...
    NB : ci à tester

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut <asp:CheckBoxField DataField="published" />
    Bonjour Emaluk,

    Concernant le type boolean sur Oracle, il n'existe pas, nous avons opté pour un type NUMBER, not null avec un check in (0,1), le seul moyen de "définir" un booléen sur oracle semble-t-il, pour le champ "published".
    Mais cela ne marche toujours pas avec l'item <asp:CheckBoxField DataField="published" />, asp.net ne reconnait pas le type de ma donnée comme un booléen valide!
    C'est fou, je craque, je deviens neuneu

    Merci pour votre aide,
    Redouane, j'essaye d'appliquer tes conseils,

    Gaëlle.

Discussions similaires

  1. booléens en mySQL
    Par nako dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 19/10/2009, 18h23
  2. 1 champ de type enum à 3 valeurs ou 2 champs booléens ?
    Par El Saigneur dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 22/01/2005, 08h53
  3. Réponses: 6
    Dernier message: 08/11/2004, 14h18
  4. lcase() traduit les booléens en francais !
    Par EvilAngel dans le forum ASP
    Réponses: 8
    Dernier message: 15/06/2004, 16h53
  5. requete sql : un vrai "et" booléen
    Par claquetteman dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/04/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo