2014-08-14 3 views
1

В настоящее время у меня есть сетка, которая заполняется хранимой процедурой. Эта хранимая процедура не может быть изменена. На моей странице у меня есть раскрывающийся список. В этом раскрывающемся списке содержатся все имена столбцов для gridview. Когда пользователь нажимает на значение, gridview сортируется по этому столбцу.Сортировка текстовых полей данных в Gridview численно

Все это не проблема. Однако проблема возникает, когда я пытаюсь сортировать один из столбцов в хронологическом порядке. У меня есть это:

<asp:TemplateField HeaderText="RollNo" SortExpression="RollNo" > 
     <ItemTemplate> 
      <asp:TextBox ID="RollNoBox" runat="server" MaxLength="2" AutoCompleteType="None" Width="35px" 
       Text='<%# Bind("RollNo") %>'> 
      </asp:TextBox> 
     </ItemTemplate> 
</asp:TemplateField> 

Когда я нажимаю на эту колонку для сортировки, он ведет себя так, как это:

Original:    Actual Sorted: 
    1        null 
    2        null 
    3        null 
    4        null 
    5        1 
    6        2 
    7        3 
    8        4 
    9        5 
    10       6 
    11       7 
    null       8 
    null       9 
    null       10 
    null       11 

Однако, я хочу своего рода, чтобы быть таким же, как оригинал (Так что я могу добавить дополнительные фильтры).

Как я могу это сделать?

Вот моя функция сортировки:

Protected Sub SortGrid() 
    Dim sortexpression As String 
    If DropDownList1.SelectedValue <> "Select" Then 
     sortexpression = DropDownList1.SelectedValue 
    End If 

     M1SchedView.Sort(sortexpression, SortDirection.Ascending) 

End Sub 

Это немного переделан из моей реальной функции, как у меня есть несколько видов на моей странице.

EDIT: Я смог получить отредактированный SP, чтобы столбец стал целым числом. Однако теперь он помещает нулевые значения перед номерами. Если бы это можно было переключить, я бы установил.

+0

показать нам свою функцию сортировки! – esskar

+0

Ваше поле «RollNo» представляет собой строку вместо числа, поэтому она сортируется так. Если вы не можете изменить SP, чтобы значение было числовым, вы должны изменить его в своем коде. Если вы используете какой-то тип EF, это должно быть легко. Если вы используете sqldatasource и позволяете ему заполнять данные, это не так просто. – Steve

+0

Я использую sqldatasource, который вызывает хранимую процедуру. – Wyatt

ответ

1

RollNo кажется string

добавить еще одно свойство int RollNoNumeric и определить его так

public int RollNoNumeric 
{ 
    get { return string.IsNullOrEmpty(this.RollNo) 
       ? int.MaxValue 
       : Convert.ToInt32(RollNo); } 
} 

затем измените SortExpression на

SortExpression="RollNoNumeric" 
+0

Я использую VB.Net, этот язык специфичен? Кроме того, я не знаю, как реализовать это, я никогда не делал этого раньше. – Wyatt

+0

Это решение, если вам нужна индивидуальная сортировка значений NULL, однако я бы рекомендовал имя «RollNoForSort» или тому подобное, поскольку вы даете (произвольное) значение значениям NULL, поэтому «RollNoNumeric» может немного вводить в заблуждение другому потом. Я бы подумал, что 'RollNoNumeric' типа' Nullable (Of Int32) 'будет более подходящим для этого имени. –

1

RollNo является строкой, преобразовать её в номер

<%# Bind("RollNo", "{0:N2}") %> 

http://msdn.microsoft.com/en-us/library/2d76z3ck(v=vs.110).aspx

+0

Я просто попробовал. Это ничего не изменило :( – Wyatt

+0

Используете ли вы datatable как источник данных? – JLane

+0

Нет, я использую sqldatasource, который вызывает хранимую процедуру, которая возвращает данные. – Wyatt