Сортировка в gridview не работает - PullRequest
5 голосов
/ 08 августа 2009

Я пытаюсь сортировать функциональность в виде сетки, но она не работает. Может ли какая-то помощь по телу?

Код:

  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 DataSet FillDataSet()
{
    string source = "Database=GridTest;Server=Localhost;Trusted_Connection=yes";
    con = new SqlConnection(source);
    cmd = new SqlCommand("proc_mygrid", con);
    ds = new DataSet();
    da = new SqlDataAdapter(cmd);
    da.Fill(ds);
    GridView1.DataSource = ds;
    GridView1.DataBind();

    return ds;


}
 protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    DataTable dt = GridView1.DataSource as DataTable;
    if (dt != null)
    {
        DataView dv = new DataView(dt);
        dv.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
        GridView1.DataSource = dv;
        GridView1.DataBind();
   }

Здесь dt приходит null. Почему? Пожалуйста, помогите спасибо.

EDIT:

enter code here  <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" 
    GridLines="None" AllowPaging="true" AllowSorting="true" PageSize="12" 
    onpageindexchanging="GridView1_PageIndexChanging" 
    onsorting="GridView1_Sorting">

РЕДАКТИРОВАТЬ (общий код)

public partial class _Default : System.Web.UI.Page 
{
    SqlConnection con;
    SqlCommand cmd;
    DataSet ds;
    SqlDataAdapter da;
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    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 DataSet FillDataSet()
    {
        string source = "Database=GridTest;Server=Localhost;Trusted_Connection=yes";
        con = new SqlConnection(source);
        cmd = new SqlCommand("proc_mygrid", con);
        ds = new DataSet();
        da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        GridView1.DataSource = ds;
        GridView1.DataBind();

        return ds;


    }
    protected void GetValues(object sender, EventArgs e)
    {
        FillDataSet();
    }

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
       int newPagenumber = e.NewPageIndex;
       GridView1.PageIndex = newPagenumber;
       GridView1.DataSource = FillDataSet();
       GridView1.DataBind();

    }


    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {

        DataSet ds = FillDataSet();
        DataTable dt = ds.Tables[0];
        if (dt != null)
        {
            dt.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

Ответы [ 3 ]

7 голосов
/ 10 августа 2009

КОД:

private string GetSortDirection(string column)
{
       string sortDirection = "DESC";
       string sortExpression = ViewState["SortExpression"] as string;

       if (sortExpression != null)
       {    
            if (sortExpression == column)
            {
                string lastDirection = ViewState["SortDirection"] as string;
                if ((lastDirection != null) && (lastDirection == "DESC"))
                {
                    sortDirection = "ASC";
                }
            }
       }

       ViewState["SortDirection"] = sortDirection;
       ViewState["SortExpression"] = column;

       return sortDirection;
}

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
   DataTable dt = ((DataSet)Session["myDataSet"]).Tables[0];
   dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
   GridView1.DataSource = dt;
   GridView1.DataBind();
}
0 голосов
/ 03 ноября 2011

In Testing.aspx.cs

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    if (dataset != null)
    {
        datatable = dataset.Tables[0];
        DataView dataView = new DataView(datatable);
        dataView.Sort = e.SortExpression;
        GridView1.DataSource = dataView;
        GridView1.DataBind();
    }
}

In Testing.aspx

<asp:GridView ID="GridView1" runat="server" 
              AllowSorting="True" OnSorting="GridView1_Sorting">
0 голосов
/ 08 августа 2009

Поскольку вы устанавливаете DataSet как DataSource, а затем приводите его к DataTable с оператором as.

Оператор 'as' в C # является предварительным приведением - если невозможно выполнить приведение (типы не совместимы) вместо генерирования исключения, так как при непосредственном приведении оператор 'as' устанавливает ссылку на ноль.

Если у вас есть только один набор данных в наборе данных, вы можете получить первый элемент, подобный этому:

ds.Tables[0];

... или используйте имя таблицы:

ds.Tables["myTable"];

в вашем случае вы можете попробовать ...

DataTable dt = GridView1.DataSource.Tables[0] as DataTable;

Надеюсь, это поможет!

EDIT

относительно вашей проблемы с сортировкой (как только вы получите данные):

if (dt != null) 
{ 
   dt.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 
   GridView1.DataBind(); 
}

Вы можете сделать это, потому что dt является ссылкой на точно такой же объект, который уже установлен в качестве источника данных для вашей сетки. Это должно сработать - если нет, то есть что-то еще, чего мне не хватает (например, мы сортируем неправильную таблицу, что означает, что у вас есть более одной таблицы в наборе данных).

EDIT:

посмотрел ваш код. Я не знаю точно, когда GetValues ​​будет запущен, но я подозреваю, что это вызывает вашу проблему (я думаю, что это может переопределить вашу сортировку или SMT в этом направлении).

Если вы закомментируете FillDataSource из getValues ​​и измените свой PageLoad для этого:

  void Page_Load(Object sender, EventArgs e)
  { 

     // Load data only once, when the page is first loaded.
     if (!IsPostBack)
     { 
        Session["myDataSet"] = FillDataSet();
     }

  }

затем в вашем методе сортировки вы извлекаете источник данных следующим образом:

DataTable dt = ((DataSet)Session["myDataSet"]).Tables[0];

Также вы можете получить DataSet из сеанса в вашем методе разбивки на страницы.

Вы также должны заметить улучшение производительности, поскольку вы извлекаете материал из БД только один раз.

Дайте ему шанс!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...