in

DotNetSide

Dot Net South Italy Developers User Group
Latest post 22 Sep 2009 13:14 by mario74. 1 replies.
Page 1 of 1 (2 items)
Sort Posts: Previous Next
  • 09 Sep 2009 10:32

    • clembo
    • Top 50 Contributor
    • Joined on 28 Dec 2007
    • Posts 6
    • Points 40

    Nascondere un pulsante in un controllo gridview

    Ho un controllo gridview nel quale voglio nascondere o mostrare un pulsante (itemtemplate) a seconda del valore contenuto in una delle colonne del controllo stesso.

    COme posso fare?

    • Post Points: 20
  • 22 Sep 2009 13:14 In reply to

    • mario74
    • Top 10 Contributor
      Male
    • Joined on 05 Mar 2006
    • Corato
    • Posts 312
    • Points 3,595

    Re: Nascondere un pulsante in un controllo gridview

     Ciao Clembo, purtroppo leggo solo ora il tuo post e anche se avrai trovato una soluzione ti rispondo lo stesso.

    Nascondere o mostrare un controllo all'interno di una colonna di una gridview e comunque eseguire altre operazioni su una cella o sull'intera riga in base al  valore contenuto  in un campo della riga stessa sono operazioni abbastanza semplici da gestire. Per questo tipo di operazioni bisogna gestire l'evento RowDataBound della GridView che viene scatenato il momento in cui viene "costruita" la riga con i rispettivi dati.

    Ti espongo due semplici esempi, nel primo la griglia viene riempita da una custom collection di oggeti, nel secono è legata direttamente ai risultai di un query verso un Db.

    Questo è la nostra griglia:

     

    <asp:GridView ID="GridView1" runat="server" onrowdatabound="GridView1_RowDataBound" AutoGenerateColumns="false">
    <Columns
    >
      
    <asp:BoundField HeaderText="Nome" DataField="FirstName"
    />
      
    <asp:BoundField HeaderText="Cognome" DataField="LastName"
    />
       
    <asp:BoundField HeaderText="Email" DataField="Email"
    />
       <asp:TemplateField
    >
       
    <ItemTemplate
    >
         
    <asp:Button ID="btnDoSomething" runat="server" Text="Do Something"
    />
       
    </ItemTemplate
    >
      
    </asp:TemplateField
    >
     
    </Columns
    >
    </asp:GridView>

    L'Obbiettivo è quello di nascondere il bottone in base a valori di altre colonne o comunque dati in pasto alla griglia.
    Supponiamo di voler bindare la griglia con una Custom Collection di oggetti Customer e il bottone deve essere mostrato se il valore booleano di una proprietà dell'oggetto è uguale a true.
    Il Code-Behind sarà del tipo (in evidenza la parte in cui viene nascosto il bottone):

     

    public partial class _Default : System.Web.UI.Page
    {
       
    protected void Page_Load(object sender, EventArgs
     e)
       {

             if (!Page.IsPostBack)
             {
               
    GridView1.DataSource = GetCustomers();
                GridView1.DataBind();
             }
        }

     

     

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            
    Customer customer = e.Row.DataItem as Customer
    ;
            
    Button btnDoSomething = e.Row.FindControl("btnDoSomething") as Button
    ;
            
    if (customer != null
    )
             {
                    btnDoSomething.Visible = customer.CanDoSomething;
             }
         }

     

     

        private List<Customer> GetCustomers()
        {
            
    List<Customer> customers = new List<Customer
    >();
             customers.Add(
    new Customer() { FirstName = "Mario", LastName = "Ferrante", Email = "mario@email.it", CanDoSomething = true
    });
            
    customers.Add(new Customer() { FirstName = "Pinco", LastName = "Pallino", Email ="pinco@email.it", CanDoSomething = false
    });
             customers.Add(
    new Customer() { FirstName = "Mario", LastName = "Rossi", Email = "mariorossi@email.it", CanDoSomething = true
    });
             customers.Add(
    new Customer() { FirstName = "Giuseppe", LastName = "Verdi", Email = "giuseppe@email.it", CanDoSomething = false
    });
             customers.Add(
    new Customer() { FirstName = "Pippo", LastName = "Pippo", Email = "pippo@email.it", CanDoSomething = false
    });
             customers.Add(
    new Customer() { FirstName = "Mickey", LastName = "Mouse", Email = "topolino@email.it", CanDoSomething = true
    });
             
    return
    customers;
        }
    }

     

     

    public class Customer
    {
        
    public string FirstName { get; set
    ; }
         
    public string LastName { get; set
    ; }
        
    public string Email { get; set
    ; }
         
    public bool CanDoSomething { get; set
    ; }
    }

     

    Nell' esempio successivo la griglia è legata ad un oggetto SqlDataSource:

    <asp:GridView ID="GridView1" runat="server" onrowdatabound="GridView1_RowDataBound" AutoGenerateColumns="false" AllowPaging="True" DataSourceID="SqlDataSource1">
    <Columns
    >
      
    <asp:BoundField HeaderText="Nome" DataField="FirstName"
    />
      
    <asp:BoundField HeaderText="Cognome" DataField="LastName"
    />
       
    <asp:BoundField HeaderText="Email" DataField="Email"
    />
       <asp:TemplateField
    >
       
    <ItemTemplate
    >
         
    <asp:Button ID="btnDoSomething" runat="server" Text="Do Something"
    />
       
    </ItemTemplate
    >
      
    </asp:TemplateField
    >
     
    </Columns
    >
    </asp:GridView
    >
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:AdventureWorksConnectionString %>"

           
    SelectCommand
    ="SELECT FirstName, LastName, EmailAddress, ContactID FROM Person.Contact">
    </asp:SqlDataSource>

    In questo caso il nostro evento RowdataBound verrà gestito in questa maniera (il bottone non viene mostrato se il campo ContactId è un numero pari):

     

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
           
    DataRowView dv = e.Row.DataItem as DataRowView
    ;
           
    Button btnDoSomething = e.Row.FindControl("btnDoSomething") as Button
    ;
           
    if (dv != null
    ){
             
    int customerId = (int)dv.Row["ContactID "
    ];
             btnDoSomething.Visible = (customerId%2 == 0);
             }

    }

    Ciao

    Mario Ferrante
    CoFounder of DotNetSide - Dot Net South Italy Developers
    Microsoft Certified Technology Specialist
    Microsoft Certified Application Developer

    • Post Points: 5
Page 1 of 1 (2 items)
Powered by Community Server (Commercial Edition), by Telligent Systems