This is a migrated thread and some comments may be shown as answers.

Problem with GridHeaderItem with text and button.

2 Answers 214 Views
Grid
This is a migrated thread and some comments may be shown as answers.
uwe
Top achievements
Rank 1
uwe asked on 18 Jul 2011, 11:53 AM
Hello,

i want to display a button and the group header text at a GridGroupHeader cell. After some searching and trying I found some usefull code snippets but the behavior is not as expected. After the PostBack-Event the group header text disappears and only the button is shown.


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Grid.aspx.cs" Inherits="GridTest.ForecastGridTest" %>
 
<%@ Register assembly="Telerik.Web.UI" namespace="Telerik.Web.UI" tagprefix="telerik" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server">
            </telerik:RadStyleSheetManager>
            <telerik:RadScriptManager ID="RadScriptManager1" runat="server">
            </telerik:RadScriptManager>
            <div>   
                <telerik:RadGrid ID="RadGrid1" runat="server" AllowPaging="True"
                                 AutoGenerateColumns="false" CellSpacing="0" GridLines="None"
                                 ShowGroupPanel="True" OnNeedDataSource="RadGrid1_OnNeedDataSource"
                                 OnItemDataBound="RadGrid1_OnItemDataBound"
                                 OnItemCreated="RadGrid1_OnItemCreated">
                    <ClientSettings AllowDragToGroup="True">
                    </ClientSettings>
                    <MasterTableView AutoGenerateColumns="False" GroupLoadMode="Server" GroupsDefaultExpanded="False">
                        <GroupByExpressions>
                            <telerik:GridGroupByExpression>
                                <SelectFields><telerik:GridGroupByField FieldName="gl1" HeaderText="gl1" /></SelectFields>
                                <GroupByFields><telerik:GridGroupByField FieldName="gl1" SortOrder="Ascending" /></GroupByFields>
                            </telerik:GridGroupByExpression>
                            <telerik:GridGroupByExpression>
                                <SelectFields><telerik:GridGroupByField FieldName="gl2" HeaderText="gl2" /></SelectFields>
                                <GroupByFields><telerik:GridGroupByField FieldName="gl2" SortOrder="Ascending" /></GroupByFields>
                            </telerik:GridGroupByExpression>
                        </GroupByExpressions>
 
                        <Columns>
                        <telerik:GridTemplateColumn HeaderStyle-Width="100px">                               
                                <ItemTemplate>
                                    <telerik:RadButton ID="RadButton1" runat="server" OnClick="OnClick" ButtonType="LinkButton" Text="plah" CommandName=""></telerik:RadButton>
                                    <telerik:RadButton ID="RadButton2" runat="server" OnClick="OnClick" ButtonType="LinkButton" Text="plah" ></telerik:RadButton>
                                </ItemTemplate>
                            </telerik:GridTemplateColumn >
                                <telerik:GridButtonColumn HeaderText="Status" UniqueName="ImageColumn" ButtonType="ImageButton" HeaderStyle-Width="100px" />
                                <telerik:GridBoundColumn DataField="Forecast_Id" DataType="System.String" FilterControlAltText="Filter type1 column" HeaderText="ForecastId"  UniqueName="Forecast" />
                                <telerik:GridBoundColumn Display="False" DataField="Forecast_StdInt03" DataType="System.Int32" UniqueName="Status"  />
                        </Columns>
                     
 
                        <CommandItemSettings ExportToPdfText="Export to PDF"></CommandItemSettings>
 
                        <RowIndicatorColumn FilterControlAltText="Filter RowIndicator column">
                            <HeaderStyle Width="20px"></HeaderStyle>
                        </RowIndicatorColumn>
 
                        <ExpandCollapseColumn FilterControlAltText="Filter ExpandColumn column">
                            <HeaderStyle Width="20px"></HeaderStyle>
                        </ExpandCollapseColumn>
 
                        <EditFormSettings>
                            <EditColumn FilterControlAltText="Filter EditCommandColumn column"></EditColumn>
                        </EditFormSettings>
                    </MasterTableView>
 
                    <FilterMenu EnableImageSprites="False"></FilterMenu>
 
                    <HeaderContextMenu CssClass="GridContextMenu GridContextMenu_Default"></HeaderContextMenu>
                </telerik:RadGrid>   
            </div>
            <telerik:RadAjaxManager runat="server">
            </telerik:RadAjaxManager>
            <asp:ObjectDataSource runat="server" ID="osd1" TypeName="GridTest.DataAccess" SelectMethod="GetDataTable" >
            </asp:ObjectDataSource>
 
        </form>
    </body>
</html>

using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
 
namespace GridTest
{
    public partial class ForecastGridTest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            RadGrid1.MasterTableView.HierarchyDefaultExpanded = false;
        }
 
 
        protected void RadGrid1_OnNeedDataSource(object sender, GridNeedDataSourceEventArgs e)
        {
            var dataAccess = new DataAccess();
            var dataTable = dataAccess.GetDataTable();
            if (sender is RadGrid)
            {
                var grid = sender as RadGrid;
                grid.DataSource = dataTable;
            }
        }
 
        protected void OnClick(object sender, EventArgs e)
        {
            if (sender is RadButton)
            {
                var button = sender as RadButton;
                button.ForeColor = Color.Red;
 
            }
        }
 
        protected void RadGrid1_OnItemDataBound(object sender, GridItemEventArgs e)
        {
           _AppendButtonToHeader(e.Item);           
        }
 
        protected void RadGrid1_OnItemCreated(object sender, GridItemEventArgs e)
        {
           _AppendButtonToHeader(e.Item);
        }
 
 
        private void _AppendButtonToHeader(object item)
        {
            if (item is GridGroupHeaderItem)
            {
                var gridGroupHeaderItem = item as GridGroupHeaderItem;
                var dataCell = gridGroupHeaderItem.DataCell;
 
                var radButton = new RadButton();
                radButton.ButtonType = RadButtonType.StandardButton;
                radButton.Text = "do";
                radButton.Click += new EventHandler(radButton_Click);
 
                dataCell.Controls.Add(radButton);
                dataCell.Controls.Add(new LiteralControl(dataCell.Text));
            }
        }
 
        void radButton_Click(object sender, EventArgs e)
        {
            
        }       
    }
}

In a prior test i moved the logic to the PreRender event, but the event registration for the radButton does not work in this case. 
Can you please point me to the right direction.

thanks and greetings
Uwe

2 Answers, 1 is accepted

Sort by
0
Princy
Top achievements
Rank 2
answered on 18 Jul 2011, 01:03 PM
Hello Uwe,

Try the following code snippet to add a RadButton Control in group header and handle the button click event as shown below.

C#:
protected void RadGrid1_ItemCreated(object sender, GridItemEventArgs e)
{
       if (e.Item is GridGroupHeaderItem)
        {
            GridGroupHeaderItem item = (GridGroupHeaderItem)e.Item;
            RadButton btn1=new RadButton();          
            btn1.ID = "Button1";
            btn1.Text = "do";
            btn1.Click += new EventHandler(btn1_Click);
            item.Cells[0].Controls.Add(btn1);
        }
}
    void btn1_Click(object sender, EventArgs e)
    {
        
    }

Thanks,
Princy.
0
uwe
Top achievements
Rank 1
answered on 19 Jul 2011, 08:15 AM
Hi Princy

Thanks for the answer, but i haven't testet it jet. I came up with my own solution. I set the header text again in the preRender method and it worked for me.

here ist my solution:

protected void RadGrid1_OnPreRender(object sender, EventArgs e)
        {
            if (sender is RadGrid)
            {
                var grid = sender as RadGrid;
                var items = grid.MasterTableView.GetItems(GridItemType.GroupHeader);
                foreach (var gridItem in items)
                {
                    var headerItem = gridItem as GridGroupHeaderItem;
                    var controlCollection = headerItem.DataCell.Controls;
                    if (controlCollection[2] is LiteralControl)
                    {
 
                        var literalControl = controlCollection[2] as LiteralControl;
                        literalControl.Text = headerItem.DataCell.Text;
                    }
                }
            }
        }

i try to test your version the in a few day and provide all with the results.

Thanks 
Uwe
Tags
Grid
Asked by
uwe
Top achievements
Rank 1
Answers by
Princy
Top achievements
Rank 2
uwe
Top achievements
Rank 1
Share this question
or