Search code examples
c#asp.netgridviewpostbackrowdatabound

Header DDL in Gridview on ispostback


I have a header DDL in my gridview that for some reason does not keep my selected value but rather binds the gridview and the header back to "starting position"

In my DDL header for Priority i have selected value '99' but after that my header gets back to starting position of my ListItem (that is Priority)

enter image description here

enter image description here

    <HeaderTemplate>
<asp:DropDownList ID="ddlPriorityHeader" AutoPostBack="True" AppendDataBoundItems="True" OnSelectedIndexChanged="ddlHeader_SelectedIndexChanged" runat="server">
                                 <asp:ListItem>Priority</asp:ListItem>
                            </asp:DropDownList>
                        </HeaderTemplate>

I have a RowDatabound for the gridview but there i do nothing more then find the DDL for the header and then bound the DDL.

protected void gwActivity_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //.............. some code.....//

 string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
                    using (SqlConnection con = new SqlConnection(CS))
                {
                    SqlCommand cmd = new SqlCommand("SELECT  DISTINCT [Priority] FROM [BI_Planning].[dbo].[tblPriority]", con);
                    con.Open();
                    ddlPriority.DataSource = cmd.ExecuteReader();
                    ddlPriority.DataTextField = "Priority";
                    ddlPriority.DataBind();
                }

}

I have put my gridview in a method:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGridviewActivity();
    }
} 

Can it be that im bounding my DDL everytime for my gridview? im stuck here....


Solution

  • You need to store ddlPriority selected text in temp place like ViewState that will keep value between postbacks.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ViewState["PriorityText"] = "Priority";
            BindGridviewActivity();
        }
    }
    

    And aftrt ddlPriority.DataBind(); set selectd text to ViewState value

    ddlPriority.Items.FindByText(ViewState["PriorityText"].ToString()).Selected = true;
    

    And in your ddlHeader_SelectedIndexChanged set ViewState to selected text

    protected void ddlHeader_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList ddlHeader = (DropDownList)sender;
        ViewState["PriorityText"] = ddlHeader.SelectedItem.Text;
    }
    

    Check this complete example for more details