Monday, March 28, 2011

Creating a header row with buttons in a Custom GridView

After posting this: http://stackoverflow.com/questions/509029/custom-header-in-gridview

...I have a related problem. I have added the table row during OnDataBound, and it shows up, the links are clickable. There are two problems with adding it here: first, if a postback occurs that doesn't DataBind, the row disappears; second, no events are happening when the LinkButtons are clicked. Here is the OnDataBound code:


protected override void OnDataBound(EventArgs e)
{
    base.OnDataBound(e);

    // Hook up the handler to create the Selection header/footer

    // TODO: Wrap this in a function sometime
    Table table = (Table)Controls[0];
    GridViewRow row = new GridViewRow(-1, -1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);

    // TODO: should add css classes
    TableHeaderCell cell = new TableHeaderCell();
    cell.ColumnSpan = Columns.Count + 1; // plus 1 for the checkbox column
    cell.HorizontalAlign = HorizontalAlign.Left; // do this or css?

    HtmlGenericControl label = new HtmlGenericControl("label");
    label.InnerText = "Select:";

    selectNoneLK = new LinkButton();
    selectNoneLK.ID = "SelectNoneLK";
    selectNoneLK.Text = "None";
    selectNoneLK.Click += SelectNoneLK_Click;
    //selectNoneLK.CommandName = "SelectNone";
    //selectNoneLK.Command += SelectNoneLK_Click;

    selectAllLK = new LinkButton();
    selectAllLK.ID = "SelectAllLK";
    selectAllLK.Text = "All on this page";
    //selectAllLK.CommandName = "SelectAll";
    //selectAllLK.Command += SelectAllLK_Click;
    selectAllLK.Click += SelectAllLK_Click;

    cell.Controls.Add(label);
    cell.Controls.Add(selectNoneLK);
    cell.Controls.Add(selectAllLK);

    row.Controls.Add(cell);

    // Find out where to put this row

    int rowIndex = 0;
    if(SelectionMode == SelectionMode.AboveHeader)
    {
        rowIndex = 0;
    }
    else if(SelectionMode == SelectionMode.BelowHeader)
    {
        rowIndex = 1;
    }
    else if(SelectionMode == SelectionMode.AboveFooter)
    {
        rowIndex = table.Rows.Count;
    }
    else if(SelectionMode == SelectionMode.BelowFooter)
    {
        rowIndex = table.Rows.Count + 1;
    }

    table.Rows.AddAt(rowIndex, row);
}
From stackoverflow
  • You can try putting it in the RowCreated Event, while the header is being created. This might also fix your problem with the LinkButtons not working.

    void GridView1_RowCreated(Object sender, GridViewRowEventArgs e)
      {
    
        if(e.Row.RowType == DataControlRowType.Header)
          {
             ...your code here
    
          }
    

0 comments:

Post a Comment