none
Test de données dans un TemplateField (Utilisation du Bind) RRS feed

  • Question

  • Bonjour,

    j'affiche dans un datagridview des données de tables.
    avec les BoundField, j'affiche directement des données des colonnes sélectionnées!
    j'ai 2 colonnes ou obligatoirement l'une des 2 a la valeur NULL, je veux donc afficher que celle ou la valeur n'est pas nulle (logique Wink dans une seule colonne (l'un contient du text, l'autre des byte[] pour faire une image)!

    bref j'essaie de tester la valeur nulle de mes données pour savoir si j'affiche l'une ou l'autre de mes données!

    Extrait de code

    <asp:TemplateField HeaderText="Ancienne valeur" SortExpression="ADL_AncienneValeur">
        <ItemTemplate>
            <% if (Bind("ADL_AncienneValeur") != DBNull.Value) { %>
                <asp:Label ID="lblAncienneValeur" runat="server" Text='<%# Bind("ADL_AncienneValeur") %>' />
            <% } else { %>
                <asp:Image ID="imgAncienneValeur" runat="server" />
            <% } %>
        </ItemTemplate>
    </asp:TemplateField>


    et forcement il y a un hic, je peux pas faire if (Bind("ADL_AncienneValeur") != DBNull.Value)
    avez vous une solution a me proposer Big Smile

    merki
    lundi 7 janvier 2008 14:07

Réponses

  • Bonjour,

    Vous pouvez par exemple :

    • Faire que votre ItemTemplate contienne à la fois un Label et une Image et masquer ensuite lors de l'évènement ItemDataBound le contrôle non désiré.
    • Mettre un Literal dans votre ItemTemplate et insérer dynamiquement le code HTML voulu lors de l'évènement ItemDataBound.

    Guillaume

    lundi 7 janvier 2008 14:34
  • Voila un exemple :

     

    Le code beside :

     

    Extrait de code

    protected void Page_Load(object sender, EventArgs e)

    {

    DataTable dt = new DataTable();

    dt.Columns.Add("COL1", typeof(string));

    dt.Columns.Add("COL2", typeof(string));

    dt.Rows.Add("COL1", DBNull.Value);

    dt.Rows.Add(DBNull.Value, "COL2");

    dt.Rows.Add("COL1", DBNull.Value);

    dt.Rows.Add(DBNull.Value, "COL2");

    dt.Rows.Add("COL1", DBNull.Value);

    dt.Rows.Add(DBNull.Value, "COL2");

     

    this.gv1.RowDataBound += new GridViewRowEventHandler(gv1_RowDataBound);

    this.gv1.DataSource = dt;

    this.gv1.DataBind();

     

    this.gv2.RowDataBound += new GridViewRowEventHandler(gv2_RowDataBound);

    this.gv2.DataSource = dt;

    this.gv2.DataBind();

    }

     

    void gv1_RowDataBound(object sender, GridViewRowEventArgs e)

    {

    if (DataControlRowType.DataRow != e.Row.RowType)

    {

    return;

    }

     

    Control lbl = e.Row.FindControl("lbl");

    if (null == lbl)

    {

    return;

    }

     

    Control img = e.Row.FindControl("img");

    if (null == img)

    {

    return;

    }

     

    lbl.Visible = ((DataRowView)e.Row.DataItem)["COL1"] != DBNull.Value;

    img.Visible = !lbl.Visible;

    }

     

    void gv2_RowDataBound(object sender, GridViewRowEventArgs e)

    {

    if (DataControlRowType.DataRow != e.Row.RowType)

    {

    return;

    }

     

    Literal lbl = e.Row.FindControl("lbl") as Literal;

    if (null == lbl)

    {

    return;

    }

     

    if (((DataRowView)e.Row.DataItem)["COL1"] != DBNull.Value)

    {

    lbl.Text = "" + (string)((DataRowView)e.Row.DataItem)["COL1"] + "";

    }

    else

    {

    lbl.Text = "";

    }

    }

     

     

    Le design :

     

    Extrait de code

    <asp:GridView ID="gv1" runat="server" AutoGenerateColumns="False">

    <Columns>

    <asp:TemplateField>

    <ItemTemplate>

    <asp:Label ID="lbl" runat="server" Text='<%# Bind("COL1") %>' />

    <asp:Image ID="img" runat="server" />

    </ItemTemplate>

    </asp:TemplateField>

    </Columns>

    </asp:GridView>

    <asp:GridView ID="gv2" runat="server" AutoGenerateColumns="False">

    <Columns>

    <asp:TemplateField>

    <ItemTemplate>

    <asp:Literal ID="lbl" runat="server" />

    </ItemTemplate>

    </asp:TemplateField>

    </Columns>

    </asp:GridView>

     

     

    La première méthode a l'avantage d'utiliser des objets WebControl mais va par contre augmenter la taille du ViewState étant donné qu'il y aura toujours 2 contrôles par ligne.

     

    Guillaume

    lundi 7 janvier 2008 16:04

Toutes les réponses

  • Bonjour,

    Vous pouvez par exemple :

    • Faire que votre ItemTemplate contienne à la fois un Label et une Image et masquer ensuite lors de l'évènement ItemDataBound le contrôle non désiré.
    • Mettre un Literal dans votre ItemTemplate et insérer dynamiquement le code HTML voulu lors de l'évènement ItemDataBound.

    Guillaume

    lundi 7 janvier 2008 14:34
  • Pouvez-vous me donner un exemple Smile

    merki
    lundi 7 janvier 2008 15:17
  • Voila un exemple :

     

    Le code beside :

     

    Extrait de code

    protected void Page_Load(object sender, EventArgs e)

    {

    DataTable dt = new DataTable();

    dt.Columns.Add("COL1", typeof(string));

    dt.Columns.Add("COL2", typeof(string));

    dt.Rows.Add("COL1", DBNull.Value);

    dt.Rows.Add(DBNull.Value, "COL2");

    dt.Rows.Add("COL1", DBNull.Value);

    dt.Rows.Add(DBNull.Value, "COL2");

    dt.Rows.Add("COL1", DBNull.Value);

    dt.Rows.Add(DBNull.Value, "COL2");

     

    this.gv1.RowDataBound += new GridViewRowEventHandler(gv1_RowDataBound);

    this.gv1.DataSource = dt;

    this.gv1.DataBind();

     

    this.gv2.RowDataBound += new GridViewRowEventHandler(gv2_RowDataBound);

    this.gv2.DataSource = dt;

    this.gv2.DataBind();

    }

     

    void gv1_RowDataBound(object sender, GridViewRowEventArgs e)

    {

    if (DataControlRowType.DataRow != e.Row.RowType)

    {

    return;

    }

     

    Control lbl = e.Row.FindControl("lbl");

    if (null == lbl)

    {

    return;

    }

     

    Control img = e.Row.FindControl("img");

    if (null == img)

    {

    return;

    }

     

    lbl.Visible = ((DataRowView)e.Row.DataItem)["COL1"] != DBNull.Value;

    img.Visible = !lbl.Visible;

    }

     

    void gv2_RowDataBound(object sender, GridViewRowEventArgs e)

    {

    if (DataControlRowType.DataRow != e.Row.RowType)

    {

    return;

    }

     

    Literal lbl = e.Row.FindControl("lbl") as Literal;

    if (null == lbl)

    {

    return;

    }

     

    if (((DataRowView)e.Row.DataItem)["COL1"] != DBNull.Value)

    {

    lbl.Text = "" + (string)((DataRowView)e.Row.DataItem)["COL1"] + "";

    }

    else

    {

    lbl.Text = "";

    }

    }

     

     

    Le design :

     

    Extrait de code

    <asp:GridView ID="gv1" runat="server" AutoGenerateColumns="False">

    <Columns>

    <asp:TemplateField>

    <ItemTemplate>

    <asp:Label ID="lbl" runat="server" Text='<%# Bind("COL1") %>' />

    <asp:Image ID="img" runat="server" />

    </ItemTemplate>

    </asp:TemplateField>

    </Columns>

    </asp:GridView>

    <asp:GridView ID="gv2" runat="server" AutoGenerateColumns="False">

    <Columns>

    <asp:TemplateField>

    <ItemTemplate>

    <asp:Literal ID="lbl" runat="server" />

    </ItemTemplate>

    </asp:TemplateField>

    </Columns>

    </asp:GridView>

     

     

    La première méthode a l'avantage d'utiliser des objets WebControl mais va par contre augmenter la taille du ViewState étant donné qu'il y aura toujours 2 contrôles par ligne.

     

    Guillaume

    lundi 7 janvier 2008 16:04
  • merci bcp pour cet exemple Big Smile
    lundi 7 janvier 2008 16:21