Сортировка в gridview не работает

Тип. GetType

тот, который я видел, кусает много людей, Type.GetType(string) . Они задаются вопросом, почему это работает на типы в их собственном блоке и некоторые типы как System.String, но не System.Windows.Forms.Form. Ответ - то, что это только смотрит в текущем блоке и в mscorlib.

Анонимные методы

C# 2.0 представил анонимные методы, ведя к противным таким ситуациям:

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for (int i=0; i < 10; i++)
        {
            ThreadStart ts = delegate { Console.WriteLine(i); };
            new Thread(ts).Start();
        }
    }
}

, Что это распечатает? Ну, это полностью зависит от планирования. Это распечатает 10 чисел, но это, вероятно, не распечатает 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, который является тем, что Вы могли бы ожидать. Проблема состоит в том, что это i переменная, которая была получена, не ее значение при создании делегата. Это может быть решено легко с дополнительной локальной переменной правильного объема:

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for (int i=0; i < 10; i++)
        {
            int copy = i;
            ThreadStart ts = delegate { Console.WriteLine(copy); };
            new Thread(ts).Start();
        }
    }
}

Задержанное выполнение блоков итератора

модульный тест Этого "бедного человека" не передает - почему нет?

using System;
using System.Collections.Generic;
using System.Diagnostics;

class Test
{
    static IEnumerable CapitalLetters(string input)
    {
        if (input == null)
        {
            throw new ArgumentNullException(input);
        }
        foreach (char c in input)
        {
            yield return char.ToUpper(c);
        }
    }

    static void Main()
    {
        // Test that null input is handled correctly
        try
        {
            CapitalLetters(null);
            Console.WriteLine("An exception should have been thrown!");
        }
        catch (ArgumentNullException)
        {
            // Expected
        }
    }
}

ответ - то, что код в источнике эти CapitalLetters код не становится выполняемым до итератора MoveNext(), метод сначала называют.

у меня есть некоторые другие причуды на моем страница .

головоломок

5
задан ghostJago 2 November 2011 в 16:57
поделиться

2 ответа

КОД:

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();
}
7
ответ дан 14 December 2019 в 08:56
поделиться

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

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

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

ds.Tables[0];

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

ds.Tables["myTable"];

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

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

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

РЕДАКТИРОВАТЬ :

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

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

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

РЕДАКТИРОВАТЬ:

просмотрел ваш код . Я не знаю точно, когда запускается 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();
     }

  }

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

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

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

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

Попробуйте!

Это должно сработать - если нет smt, еще мне не хватает (например, мы сортируем неправильную таблицу, что означает, что у вас более одной таблицы в DataSet).

РЕДАКТИРОВАТЬ:

просмотрел ваш код . Я не знаю точно, когда запускается 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();
     }

  }

затем в методе сортировки вы извлекаете DataSource следующим образом:

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

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

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

Попробуйте!

Это должно сработать - если нет smt, еще мне не хватает (например, мы сортируем неправильную таблицу, что означает, что у вас более одной таблицы в DataSet).

РЕДАКТИРОВАТЬ:

просмотрел ваш код . Я не знаю точно, когда запускается 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();
     }

  }

затем в методе сортировки вы извлекаете DataSource следующим образом:

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

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

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

Попробуйте!

повторная сортировка неправильной таблицы означает, что у вас более одной таблицы в DataSet).

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();
     }

  }

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

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

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

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

Попробуйте!

повторная сортировка неправильной таблицы означает, что у вас более одной таблицы в DataSet).

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();
     }

  }

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

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

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

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

Попробуйте!

0
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: