Help with Dynamic Columns in Datagrid and Postback

Discussion in 'ASP .Net Datagrid Control' started by CAK, Jul 31, 2004.

  1. CAK

    CAK Guest

    Hi,

    I'm having problems retaining my dynamic columns during postbacks.
    I've read that if you create dynamic columns at runtime, you have to
    add them during the page_init event. I've done that, but I'm not sure
    what else I'm supposed to do to make this work properly. Basically,
    I've created a search page with a bunch of criteria - when the user
    clicks search, it searches for all the criteria that has been filled
    in and eventually stores whether a criterion is active or not in a
    view state variable, then it should go through them and add a column
    if the criterion is active. I've been playing around with different
    things, but nothing makes my dynamic columns stay when I try to sort
    or, more importantly, when I try to pull data from the dynamic
    columns. I've added the function to the page_init event that adds all
    the dynamic columns, but am I supposed to rebind the grid afterwards?
    I may also be mismanaging my view state variables.

    Thanks for any ideas or suggestions anyone can give me.

    Code Follows - I tried to edit it down a bit:

    <asp:datagrid id="dgdSearch" runat="server" BackColor="White"
    Width="374px" Font-Names="verdana"
    BorderColor="#3366CC" BorderStyle="None" Font-Size="X-Small"
    AutoGenerateColumns="False" AllowPaging="True" PageSize="15"
    AllowSorting="True"
    CellPadding="4" BorderWidth="1px">
    <SelectedItemStyle Font-Bold="True" ForeColor="#CCFF99"
    BackColor="#009999"></SelectedItemStyle>
    <AlternatingItemStyle BackColor="Gainsboro"></AlternatingItemStyle>
    <ItemStyle ForeColor="#003399" BackColor="White"></ItemStyle>
    <HeaderStyle Font-Bold="True" ForeColor="#CCCCFF"
    BackColor="#003399"></HeaderStyle>
    <FooterStyle ForeColor="#003399" BackColor="#99CCCC"></FooterStyle>
    <Columns>
    <asp:HyperLinkColumn Text="View" Target="_blank"
    DataNavigateUrlField="PropertyID"
    DataNavigateUrlFormatString="PropertyMain.aspx?PropertyID={0}"
    DataTextField="PropertyID" SortExpression="PropertyID"
    HeaderText="Property ID"></asp:HyperLinkColumn>
    <asp:TemplateColumn HeaderText="Mark">
    <ItemTemplate>
    <asp:CheckBox id="chkMark" runat="server"></asp:CheckBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:ButtonColumn Visible="False" Text="Delete"
    CommandName="Delete"></asp:ButtonColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Left" ForeColor="#003399"
    BackColor="#99CCCC" Mode="NumericPages"></PagerStyle>
    </asp:datagrid>




    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles MyBase.Init
    'CODEGEN: This method call is required by the Web Form
    Designer
    'Do not modify it using the code editor.
    InitializeComponent()

    Call AddDynamicColumns()

    End Sub


    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles MyBase.Load
    'Put user code to initialize the page here
    txtUser.Text = Web.HttpContext.Current.User.Identity.Name

    If Not Page.IsPostBack Then
    FillDropDowns()
    Me.btnAddNew.Attributes.Add("onClick",
    "window.open('PropertyMain.aspx');")

    ' Create viewstates for the boolean variables
    viewstate.Add("blnCounty", False)
    viewstate.Add("blnPropertyType", False)
    '** additional criteria items removed for brevity ***

    End If

    End Sub


    Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e
    As System.EventArgs) Handles btnSearch.Click

    FillSearchDatagrid()

    End Sub

    Private Sub FillSearchDatagrid()

    Dim lstItem As ListItem
    Dim strSql As String
    Dim intCount As Integer

    Dim blnCounty As Boolean
    Dim blnPropertyType as Boolean
    '** additional criteria items removed for brevity ***

    ' Reset all the variables
    strSQL = " WHERE 0 = 0"


    ' County
    intCount = 0
    For Each lstItem In lstCounty.Items
    If lstItem.Selected Then
    If Convert.ToInt32(lstItem.Value) > 0 Then
    If intCount > 0 Then
    strSql += " OR County = " & lstItem.Value
    Else
    strSql += " AND (County = " & lstItem.Value
    End If
    intCount = intCount + 1
    blnCounty = True
    End If
    End If
    Next
    If intCount > 0 Then
    strSql += ")"
    End If
    ' Property Type
    intCount = 0
    For Each lstItem In lstPropertyType.Items
    If lstItem.Selected Then
    If Convert.ToInt32(lstItem.Value) > 0 Then
    If intCount > 0 Then
    strSql += " OR PropertyType = " &
    lstItem.Value
    Else
    strSql += " AND (PropertyType = " &
    lstItem.Value
    End If
    intCount = intCount + 1
    blnPropertyType = True
    End If
    End If
    Next
    If intCount > 0 Then
    strSql += ")"
    End If

    '*** additional criteria items removed for brevity ***

    If viewstate("SearchString") Is Nothing Then
    viewstate.Add("SearchString", strSql)
    Else
    viewstate("SearchString") = strSql
    End If

    Dim dsWeb As DataSet =
    DAL.Properties.PropertiesSearchDataset(strSql, _
    blnCounty)

    '*** additional criteria items removed for brevity ***

    Dim dvWeb As New DataView(dsWeb.Tables(0))

    Dim strSort As String = ""

    If Not viewstate("SortField") Is Nothing Then
    strSort = Convert.ToString(viewstate("SortField")) &
    Convert.ToString(viewstate("SortDirection"))
    Else
    strSort = "PropertyID"
    End If

    viewstate("blnCounty") = blnCounty
    viewstate("blnPropertyType") = blnPropertyType
    '*** additional criteria items removed for brevity ***

    dvWeb.Sort = strSort
    dgdSearch.DataSource = dvWeb
    dgdSearch.DataKeyField = "PropertyID"
    dgdSearch.DataBind()


    End Sub

    Private Sub dgdSearch_SortCommand(ByVal source As Object, ByVal e
    As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles
    dgdSearch.SortCommand

    If dgdSearch.EditItemIndex = -1 Then
    ' If SortDirection viewstate doesn't exist, add it
    If viewstate("SortDirection") Is Nothing Then
    viewstate.Add("SortDirection", " ASC")
    End If
    ' If SortField viewstate doesn't exist, add it
    If Convert.ToString(viewstate("SortField")) Is Nothing
    Then
    viewstate.Add("CustomSortField", e.SortExpression)
    Else
    ' If SortField viewstate is the same as the sort
    expression, then we
    ' just want to change direction
    If Convert.ToString(viewstate("SortField")) =
    e.SortExpression Then
    If Convert.ToString(viewstate("SortDirection")) =
    " ASC" Then
    viewstate("SortDirection") = " DESC"
    Else
    viewstate("SortDirection") = " ASC"
    End If
    Else
    ' SortField viewstate is different than the sort
    expression, we need
    ' to set new sortfield
    viewstate("SortField") = e.SortExpression
    viewstate("SortDirection") = " ASC"
    End If
    End If
    FillSearchDatagrid()
    End If

    End Sub

    Private Sub dgdSearch_PageIndexChanged(ByVal source As Object,
    ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs)
    Handles dgdSearch.PageIndexChanged

    If dgdSearch.EditItemIndex = -1 Then
    dgdSearch.CurrentPageIndex = e.NewPageIndex
    FillSearchDatagrid()
    End If
    End Sub



    Private Sub dgdSearch_ItemDataBound(ByVal sender As Object, ByVal
    e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles
    dgdSearch.ItemDataBound

    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType =
    ListItemType.AlternatingItem Then
    Dim webCtrl As WebControl
    For Each webCtrl In e.Item.Controls
    If CType(e.Item.Controls(2).Controls(0),
    LinkButton).CommandName = "Delete" Then
    CType(e.Item.Controls(2).Controls(0),
    WebControl).Attributes.Add("onclick", "return confirm('Are you sure
    you want to delete this item?');")
    End If
    Next
    End If

    End Sub

    Private Sub dgdSearch_DeleteCommand(ByVal source As Object, ByVal
    e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
    dgdSearch.DeleteCommand

    DAL.Properties.PropertiesDelete(Convert.ToInt32(dgdSearch.DataKeys(e.Item.ItemIndex)))
    FillSearchDatagrid()

    End Sub

    Private Sub chkAllowDelete_CheckedChanged(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles chkAllowDelete.CheckedChanged

    If Me.chkAllowDelete.Checked = True Then
    Me.dgdSearch.Columns(2).Visible = True
    Else
    Me.dgdSearch.Columns(2).Visible = False
    End If
    FillSearchDatagrid()

    End Sub

    Sub AddDynamicColumns()


    Dim bndCol4 As New BoundColumn
    bndCol4.HeaderText = "Property Name"
    bndCol4.DataField = "PropertyName"
    bndCol4.SortExpression = "PropertyName"
    dgdSearch.Columns.Add(bndCol4)

    If Convert.ToBoolean(viewstate("blnPropertyType")) = True Then
    Dim bndCol5 As New BoundColumn
    bndCol5.HeaderText = "PropertyType"
    bndCol5.DataField = "DescrPropertyType"
    bndCol5.SortExpression = "DescrPropertyType"
    dgdSearch.Columns.Add(bndCol5)
    End If

    If Convert.ToBoolean(viewstate("blnCounty")) = True Then
    Dim bndCol8 As New BoundColumn
    bndCol8.HeaderText = "County"
    bndCol8.DataField = "DescrCounty"
    bndCol8.SortExpression = "DescrCounty"
    dgdSearch.Columns.Add(bndCol8)
    End If
    '*** additional criteria items removed for brevity ***

    End Sub
    CAK, Jul 31, 2004
    #1
    1. Advertising

  2. I'm wondering if Denis Bauer's DynamicControlsPlaceholder control would help
    you here?

    "Problem:
    ASP.NET gives a developer the opportunity to programmatically add controls
    to a web form using ParentControl.Controls.Add(new Control());
    However, these controls are not persisted in any way thus having to be
    recreated for each subsequent request.

    Goal:
    To create a control that behaves like a placeholder but additionally handles
    recreating dynamic controls on subsequent requests."

    http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx


    "CAK" <> wrote in message
    news:...
    > Hi,
    >
    > I'm having problems retaining my dynamic columns during postbacks.
    > I've read that if you create dynamic columns at runtime, you have to
    > add them during the page_init event. I've done that, but I'm not sure
    > what else I'm supposed to do to make this work properly. Basically,
    > I've created a search page with a bunch of criteria - when the user
    > clicks search, it searches for all the criteria that has been filled
    > in and eventually stores whether a criterion is active or not in a
    > view state variable, then it should go through them and add a column
    > if the criterion is active. I've been playing around with different
    > things, but nothing makes my dynamic columns stay when I try to sort
    > or, more importantly, when I try to pull data from the dynamic
    > columns. I've added the function to the page_init event that adds all
    > the dynamic columns, but am I supposed to rebind the grid afterwards?
    > I may also be mismanaging my view state variables.
    >
    > Thanks for any ideas or suggestions anyone can give me.
    >
    > Code Follows - I tried to edit it down a bit:
    >
    > <asp:datagrid id="dgdSearch" runat="server" BackColor="White"
    > Width="374px" Font-Names="verdana"
    > BorderColor="#3366CC" BorderStyle="None" Font-Size="X-Small"
    > AutoGenerateColumns="False" AllowPaging="True" PageSize="15"
    > AllowSorting="True"
    > CellPadding="4" BorderWidth="1px">
    > <SelectedItemStyle Font-Bold="True" ForeColor="#CCFF99"
    > BackColor="#009999"></SelectedItemStyle>
    > <AlternatingItemStyle BackColor="Gainsboro"></AlternatingItemStyle>
    > <ItemStyle ForeColor="#003399" BackColor="White"></ItemStyle>
    > <HeaderStyle Font-Bold="True" ForeColor="#CCCCFF"
    > BackColor="#003399"></HeaderStyle>
    > <FooterStyle ForeColor="#003399" BackColor="#99CCCC"></FooterStyle>
    > <Columns>
    > <asp:HyperLinkColumn Text="View" Target="_blank"
    > DataNavigateUrlField="PropertyID"
    > DataNavigateUrlFormatString="PropertyMain.aspx?PropertyID={0}"
    > DataTextField="PropertyID" SortExpression="PropertyID"
    > HeaderText="Property ID"></asp:HyperLinkColumn>
    > <asp:TemplateColumn HeaderText="Mark">
    > <ItemTemplate>
    > <asp:CheckBox id="chkMark" runat="server"></asp:CheckBox>
    > </ItemTemplate>
    > </asp:TemplateColumn>
    > <asp:ButtonColumn Visible="False" Text="Delete"
    > CommandName="Delete"></asp:ButtonColumn>
    > </Columns>
    > <PagerStyle HorizontalAlign="Left" ForeColor="#003399"
    > BackColor="#99CCCC" Mode="NumericPages"></PagerStyle>
    > </asp:datagrid>
    >
    >
    >
    >
    > Private Sub Page_Init(ByVal sender As System.Object, ByVal e As
    > System.EventArgs) Handles MyBase.Init
    > 'CODEGEN: This method call is required by the Web Form
    > Designer
    > 'Do not modify it using the code editor.
    > InitializeComponent()
    >
    > Call AddDynamicColumns()
    >
    > End Sub
    >
    >
    > Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
    > System.EventArgs) Handles MyBase.Load
    > 'Put user code to initialize the page here
    > txtUser.Text = Web.HttpContext.Current.User.Identity.Name
    >
    > If Not Page.IsPostBack Then
    > FillDropDowns()
    > Me.btnAddNew.Attributes.Add("onClick",
    > "window.open('PropertyMain.aspx');")
    >
    > ' Create viewstates for the boolean variables
    > viewstate.Add("blnCounty", False)
    > viewstate.Add("blnPropertyType", False)
    > '** additional criteria items removed for brevity ***
    >
    > End If
    >
    > End Sub
    >
    >
    > Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e
    > As System.EventArgs) Handles btnSearch.Click
    >
    > FillSearchDatagrid()
    >
    > End Sub
    >
    > Private Sub FillSearchDatagrid()
    >
    > Dim lstItem As ListItem
    > Dim strSql As String
    > Dim intCount As Integer
    >
    > Dim blnCounty As Boolean
    > Dim blnPropertyType as Boolean
    > '** additional criteria items removed for brevity ***
    >
    > ' Reset all the variables
    > strSQL = " WHERE 0 = 0"
    >
    >
    > ' County
    > intCount = 0
    > For Each lstItem In lstCounty.Items
    > If lstItem.Selected Then
    > If Convert.ToInt32(lstItem.Value) > 0 Then
    > If intCount > 0 Then
    > strSql += " OR County = " & lstItem.Value
    > Else
    > strSql += " AND (County = " & lstItem.Value
    > End If
    > intCount = intCount + 1
    > blnCounty = True
    > End If
    > End If
    > Next
    > If intCount > 0 Then
    > strSql += ")"
    > End If
    > ' Property Type
    > intCount = 0
    > For Each lstItem In lstPropertyType.Items
    > If lstItem.Selected Then
    > If Convert.ToInt32(lstItem.Value) > 0 Then
    > If intCount > 0 Then
    > strSql += " OR PropertyType = " &
    > lstItem.Value
    > Else
    > strSql += " AND (PropertyType = " &
    > lstItem.Value
    > End If
    > intCount = intCount + 1
    > blnPropertyType = True
    > End If
    > End If
    > Next
    > If intCount > 0 Then
    > strSql += ")"
    > End If
    >
    > '*** additional criteria items removed for brevity ***
    >
    > If viewstate("SearchString") Is Nothing Then
    > viewstate.Add("SearchString", strSql)
    > Else
    > viewstate("SearchString") = strSql
    > End If
    >
    > Dim dsWeb As DataSet =
    > DAL.Properties.PropertiesSearchDataset(strSql, _
    > blnCounty)
    >
    > '*** additional criteria items removed for brevity ***
    >
    > Dim dvWeb As New DataView(dsWeb.Tables(0))
    >
    > Dim strSort As String = ""
    >
    > If Not viewstate("SortField") Is Nothing Then
    > strSort = Convert.ToString(viewstate("SortField")) &
    > Convert.ToString(viewstate("SortDirection"))
    > Else
    > strSort = "PropertyID"
    > End If
    >
    > viewstate("blnCounty") = blnCounty
    > viewstate("blnPropertyType") = blnPropertyType
    > '*** additional criteria items removed for brevity ***
    >
    > dvWeb.Sort = strSort
    > dgdSearch.DataSource = dvWeb
    > dgdSearch.DataKeyField = "PropertyID"
    > dgdSearch.DataBind()
    >
    >
    > End Sub
    >
    > Private Sub dgdSearch_SortCommand(ByVal source As Object, ByVal e
    > As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles
    > dgdSearch.SortCommand
    >
    > If dgdSearch.EditItemIndex = -1 Then
    > ' If SortDirection viewstate doesn't exist, add it
    > If viewstate("SortDirection") Is Nothing Then
    > viewstate.Add("SortDirection", " ASC")
    > End If
    > ' If SortField viewstate doesn't exist, add it
    > If Convert.ToString(viewstate("SortField")) Is Nothing
    > Then
    > viewstate.Add("CustomSortField", e.SortExpression)
    > Else
    > ' If SortField viewstate is the same as the sort
    > expression, then we
    > ' just want to change direction
    > If Convert.ToString(viewstate("SortField")) =
    > e.SortExpression Then
    > If Convert.ToString(viewstate("SortDirection")) =
    > " ASC" Then
    > viewstate("SortDirection") = " DESC"
    > Else
    > viewstate("SortDirection") = " ASC"
    > End If
    > Else
    > ' SortField viewstate is different than the sort
    > expression, we need
    > ' to set new sortfield
    > viewstate("SortField") = e.SortExpression
    > viewstate("SortDirection") = " ASC"
    > End If
    > End If
    > FillSearchDatagrid()
    > End If
    >
    > End Sub
    >
    > Private Sub dgdSearch_PageIndexChanged(ByVal source As Object,
    > ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs)
    > Handles dgdSearch.PageIndexChanged
    >
    > If dgdSearch.EditItemIndex = -1 Then
    > dgdSearch.CurrentPageIndex = e.NewPageIndex
    > FillSearchDatagrid()
    > End If
    > End Sub
    >
    >
    >
    > Private Sub dgdSearch_ItemDataBound(ByVal sender As Object, ByVal
    > e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles
    > dgdSearch.ItemDataBound
    >
    > If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType =
    > ListItemType.AlternatingItem Then
    > Dim webCtrl As WebControl
    > For Each webCtrl In e.Item.Controls
    > If CType(e.Item.Controls(2).Controls(0),
    > LinkButton).CommandName = "Delete" Then
    > CType(e.Item.Controls(2).Controls(0),
    > WebControl).Attributes.Add("onclick", "return confirm('Are you sure
    > you want to delete this item?');")
    > End If
    > Next
    > End If
    >
    > End Sub
    >
    > Private Sub dgdSearch_DeleteCommand(ByVal source As Object, ByVal
    > e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles
    > dgdSearch.DeleteCommand
    >
    >
    > DAL.Properties.PropertiesDelete(Convert.ToInt32(dgdSearch.DataKeys(e.Item.ItemIndex)))
    > FillSearchDatagrid()
    >
    > End Sub
    >
    > Private Sub chkAllowDelete_CheckedChanged(ByVal sender As Object,
    > ByVal e As System.EventArgs) Handles chkAllowDelete.CheckedChanged
    >
    > If Me.chkAllowDelete.Checked = True Then
    > Me.dgdSearch.Columns(2).Visible = True
    > Else
    > Me.dgdSearch.Columns(2).Visible = False
    > End If
    > FillSearchDatagrid()
    >
    > End Sub
    >
    > Sub AddDynamicColumns()
    >
    >
    > Dim bndCol4 As New BoundColumn
    > bndCol4.HeaderText = "Property Name"
    > bndCol4.DataField = "PropertyName"
    > bndCol4.SortExpression = "PropertyName"
    > dgdSearch.Columns.Add(bndCol4)
    >
    > If Convert.ToBoolean(viewstate("blnPropertyType")) = True Then
    > Dim bndCol5 As New BoundColumn
    > bndCol5.HeaderText = "PropertyType"
    > bndCol5.DataField = "DescrPropertyType"
    > bndCol5.SortExpression = "DescrPropertyType"
    > dgdSearch.Columns.Add(bndCol5)
    > End If
    >
    > If Convert.ToBoolean(viewstate("blnCounty")) = True Then
    > Dim bndCol8 As New BoundColumn
    > bndCol8.HeaderText = "County"
    > bndCol8.DataField = "DescrCounty"
    > bndCol8.SortExpression = "DescrCounty"
    > dgdSearch.Columns.Add(bndCol8)
    > End If
    > '*** additional criteria items removed for brevity ***
    >
    > End Sub
    Ken Cox [Microsoft MVP], Aug 6, 2004
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?dmFuZGls?=
    Replies:
    2
    Views:
    1,190
    Eliyahu Goldin
    Jan 25, 2007
  2. rob thomson
    Replies:
    0
    Views:
    260
    rob thomson
    Sep 4, 2003
  3. George
    Replies:
    1
    Views:
    206
    George
    Jan 22, 2004
  4. tsarna

    Sort not firing PostBack event using Dynamic Columns

    tsarna, Jun 23, 2004, in forum: ASP .Net Datagrid Control
    Replies:
    2
    Views:
    186
    tsarna
    Jun 28, 2004
  5. ton
    Replies:
    2
    Views:
    205
    Alvin Bruney [MVP]
    Feb 11, 2004
Loading...

Share This Page