сортировка Gridview не работает - PullRequest
       17

сортировка Gridview не работает

2 голосов
/ 29 сентября 2011

У меня есть страница asp.net, содержащая gridview как следующее

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
                    OnPageIndexChanging="gridView_PageIndexChanging" 
                    OnSorting="TaskGridView_Sorting"
                    AllowSorting="True"  AutoGenerateColumns="False" 
                    onselectedindexchanged="GridView1_SelectedIndexChanged" 
                    BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" 
                    CellPadding="3" CellSpacing="2">
                    <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
                    <Columns>
                      <asp:boundfield datafield="name_english" convertemptystringtonull="true" headertext="Name"/>
                        <asp:BoundField DataField="Inc_ID" convertemptystringtonull="true" HeaderText="Inc_ID" SortExpression="Inc_ID"/>
                        <asp:BoundField DataField="UID" HeaderText="Study_UID" SortExpression= "UID"/>
                    </Columns>
                    <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
                    <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
                    <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
                    <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
                </asp:GridView>

Я заполняю и сортирую, используя следующий код

        protected void Button1_Click(object sender, EventArgs e)
        {
            //connection to database 
            string connection = System.Configuration.ConfigurationManager.ConnectionStrings["NorthindConnectionString"].ConnectionString;
            SqlConnection myConn = new SqlConnection(connection);
            myConn.Open();
            SqlCommand cmd = new SqlCommand(" WorkList", myConn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@Name", TextBox1.Text));
            cmd.Parameters.Add(new SqlParameter("@ID", TextBox2.Text)); 
            cmd.Parameters.Add(new SqlParameter("@AccNo", TextBox4.Text)); 


            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            GridView1.DataSource = ds;
            GridView1.DataBind();

            Session["TaskTable"] = ds.Tables[0]; 

            ds.Dispose();
            da.Dispose();
            GridView1.Visible = true;

            myConn.Close();


        }
 protected void TaskGridView_Sorting(object sender, GridViewSortEventArgs e)
        {

            //Retrieve the table from the session object.
            DataTable dt = Session["TaskTable"] as DataTable;

            if (dt != null)
            {

                //Sort the data.
                dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
                GridView1.DataSource = Session["TaskTable"];
                GridView1.DataBind();
            }

        }



        private string GetSortDirection(string column)
        {

            // By default, set the sort direction to ascending.
            string sortDirection = "ASC";

            // Retrieve the last column that was sorted.
            string sortExpression = ViewState["SortExpression"] as string;

            if (sortExpression != null)
            {
                // Check if the same column is being sorted.
                // Otherwise, the default value can be returned.
                if (sortExpression == column)
                {
                    string lastDirection = ViewState["SortDirection"] as string;
                    if ((lastDirection != null) && (lastDirection == "ASC"))
                    {
                        sortDirection = "DESC";
                    }
                }
            }

            // Save new values in ViewState.
            ViewState["SortDirection"] = sortDirection;
            ViewState["SortExpression"] = column;

            return sortDirection;
        }


    }

проблема, когда щелчок по любому заголовку для сортировки вызывает ошибку System.IndexOutOfRangeException: не удается найти имя столбца .., любая идея, чтобы решить эту проблему, я уверен из имени столбцов в базе данных,

Ответы [ 3 ]

4 голосов
/ 29 сентября 2011
private string ConvertSortDirectionToSql(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;

        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;

            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }

        return newSortDirection;
    }


    protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dataTable = gridView.DataSource as DataTable;

        if (dataTable != null)
        {
            DataView dataView = new DataView(dataTable);
            dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);

            gridView.DataSource = dataView;
            gridView.DataBind();
        }
    }

попробуйте этот код ..

2 голосов
/ 29 сентября 2011

Вам нужно привязать свою сетку к отсортированному представлению (а не к исходной таблице), чтобы сортировка работала.

protected void TaskGridView_Sorting(object sender, GridViewSortEventArgs e)
{
    //Retrieve the table from the session object.
    DataTable dt = Session["TaskTable"] as DataTable;

    if (dt != null)
    {

        //Sort the data.
        dt.DefaultView.Sort = e.SortExpression;
        GridView1.DataSource = dt.DefaultView;
        GridView1.DataBind();
    }
}

Я не уверен, если вам нужен GetSortDirection метод.

Также обратите внимание, что свойство SortExpression состоит из направления сортировки (например, "UID DESC" ), поэтому основывайте свою логику на этом. В вашем коде может быть установлено выражение сортировки, например "UID DESC ASC" , что, очевидно, является неправильным выражением.

1 голос
/ 16 июля 2015

Для того, чтобы код работал в asp.net или в веб-среде, вам нужно поместить сетку в Session в объект сеанса, а сортировку - в состояние просмотра.Чтобы сортировка работала с подкачкой, выполните следующие действия.

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    { 
      Session["SearchTable"] = gv_GridView.DataSource;
      LoadSearchGrid("Select * from WF_Search);
}
private void LoadSearchGrid(string query)
{
    DataTable dsp = new DataTable();
    conn = new SqlConnection(ConnectionString);
    SqlDataAdapter sda = new SqlDataAdapter(query, conn);
    conn.Open();
    sda.Fill(dsp);
    Session["SearchTable"] = dsp;
    gv_GridView.DataSource = Session["SearchTable"];
    gv_GridView.DataBind();
    conn.Close();
    sda.Dispose();
}
protected void gv_GridView_Sorting(object sender, GridViewSortEventArgs e)
{
    ViewState["SortDirection"] = e.SortDirection;
    DataTable dtr = Session["SearchTable"] as DataTable;
    if (dtr != null)
    {
        dtr.DefaultView.Sort = e.SortExpression + " " + getSortDirection(e.SortExpression);
        gv_GridView.DataSource = Session["SearchTable"];
        gv_GridView.DataBind();
        Session["SearchTable"] = gv_GridView.DataSource;
    }
}
private string getSortDirection(string column)
{
    string sortDirection = "ASC";
    string sortExpression = ViewState["SortDirection"] as string;
    if (sortExpression != null)
    {
        if (sortExpression == column)
        {
            string lastDirection = ViewState["SortDirection"] as string;
            if (lastDirection != null && lastDirection == "ASC")
            {
                sortDirection = "DESC";
            }
        }
    }
    ViewState["SortDirection"] = sortDirection;
    ViewState["SortExpression"] = column;

    return sortDirection;
}
protected void gv_GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gv_GridView.DataSource = Session["SearchTable"];
    gv_GridView.DataBind();
    gv_GridView.PageIndex = e.NewPageIndex;

}
...