GridView сортировка
От: zodiac7700 Россия  
Дата: 30.11.10 10:47
Оценка:
Здравствуйте. Помогите разобраться в почему не работает сортировка.
Когда определяешь sqldatasource и указываешь его для GridView в качестве источника данных
в aspx-файле, то cортировка в GridView работает нормально:
<asp:GridView ID="GridViewInc" runat="server" Height="100%" Width="100%" 
        datasourceid="CustomersSource" 
        AllowSorting="True" AutoGenerateColumns="False"  
        onsorting="GridViewInc_Sorting1">
            <Columns>
                <asp:BoundField DataField="Раздел" HeaderText="Раздел" 
                    SortExpression="Раздел" />
                <asp:BoundField DataField="Описание" HeaderText="Описание" 
                    SortExpression="Описание" />
                <asp:BoundField DataField="Тип" HeaderText="Тип" SortExpression="Тип" />
                <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" />
            </Columns>
        </asp:GridView>
        <asp:sqldatasource id="CustomersSource"
        selectcommand="SELECT UnitName as 'Раздел', Description as 'Описание',Type as 'Тип', UnitID as 'ID' from t_Units (noLock)"
        connectionstring= "Data Source = localhost;Initial Catalog=RealInc;Integrated Security =True" 
        runat="server"/>


А если это делаешь в cs-файле, то сортировка не работает:
protected void Page_Load(object sender, EventArgs e)
    {
        string Query = "SELECT UnitName as 'Раздел', Description as 'Описание',Type as 'Тип', UnitID as 'ID' from t_Units";
        SqlDataSource DataSourceInc = new SqlDataSource("Data Source = localhost;Initial Catalog=RealInc;Integrated Security =True", Query);
        GridViewInc.DataSource = DataSourceInc;
        GridViewInc.DataBind();
    }


Не пойму в чем дело...
Re: GridView сортировка
От: zodiac7700 Россия  
Дата: 30.11.10 11:25
Оценка:
В предыдущем посте я похоже зря в Page_Load засунул привязку данных, т.к., видимо, это событие вызывается
после сортировки, — просто когда начал разбираться, для удобства это сделал.

Вообще, заполнение грида происходит при выборе узла дерева, которое находится на этой же странице:
 protected void TreeViewInc_SelectedNodeChanged(object sender, EventArgs e)
   {
       string Query = "SELECT UnitName as 'Раздел', Description as 'Описание',Type as 'Тип', UnitID as 'ID' from t_Units WHERE ParentID=";
       if (TreeViewInc.SelectedNode.Depth == 0)
           Query += "0";
       else
           Query += TreeViewInc.SelectedNode.Value.ToString();
       DataSourceInc = new SqlDataSource("Data Source = localhost;Initial Catalog=RealInc;Integrated Security =True", Query);
       GridViewInc.DataSource = DataSourceInc;
       GridViewInc.DataBind();
   }


Но проблему так и не решил.
Re[2]: GridView сортировка
От: zodiac7700 Россия  
Дата: 01.12.10 12:19
Оценка:
Сам с собою тихо я веду беседу...
Кажется выяснил почему в одном случае грид сортировался, а в другом нет:
[msdn]Элемент управления GridView допускает два способа привязки к данным:
Привязка данных с использованием свойства DataSourceID, позволяющего привязать элемент управления GridView к элементу управления источника данных. Этот подход является предпочтительным, поскольку он позволяет элементу управления GridView использовать возможности элемента управления источника данных и предоставить встроенную функциональность для сортировки, разбиения по страницам и обновления данных.
Привязка данных с использованием свойства DataSource, позволяющего выполнять привязку к различным объектам, включая наборы данных и модули чтения данных ADO.NET. При использовании этого подхода код реализации дополнительной функциональности наподобие сортировки, разбиения по страницам и обновления данных требуется писать самостоятельно.[/msdn]

Привязаться по DataSourceID в cs-файле у меня не получилось, поэтому делаю это с помощью
DataSource, для сортировки решил использовать DataView:

public partial class Inc : System.Web.UI.Page
{
    SqlConnection RealIncConn;
    DataSet dsInc;

    void Page_Init(object sender, EventArgs e)
    {
        ...
        dsInc = new DataSet();
    }
        
    protected void TreeViewInc_SelectedNodeChanged(object sender, EventArgs e)
    {
        SqlCommand sqlCommand = new SqlCommand("SELECT UnitName as 'Раздел',  Description as 'Описание',Type as 'Тип', UnitID as 'ID' from t_Units WHERE ParentID=@ParentID", RealIncConn);
        sqlCommand.Parameters.Add("@ParentID", SqlDbType.Int);
        sqlCommand.Parameters["@ParentID"].Value = TreeViewInc.SelectedNode.Value;
        SqlDataAdapter adapterInc = new SqlDataAdapter();
        adapterInc.SelectCommand = sqlCommand;
        adapterInc.Fill(dsInc, "Units");
        DataView dvInc = new DataView(dsInc.Tables["Units"]);
        dvInc.Sort = "Раздел";
        GridViewInc.DataSource = dvInc;
        GridViewInc.DataBind();
    }
    
    protected void GridViewInc_Sorting1(object sender, GridViewSortEventArgs e)
    {
        /*SqlCommand sqlCommand = new SqlCommand("SELECT UnitName as 'Раздел',  Description as 'Описание',Type as 'Тип', UnitID as 'ID' from t_Units WHERE ParentID=@ParentID", RealIncConn);
        sqlCommand.Parameters.Add("@ParentID", SqlDbType.Int);
        sqlCommand.Parameters["@ParentID"].Value = TreeViewInc.SelectedNode.Value;
        SqlDataAdapter adapterInc = new SqlDataAdapter();
        adapterInc.SelectCommand = sqlCommand;
        DataSet dsInc = new DataSet();
        adapterInc.Fill(dsInc, "Units");
        DataView dvInc = new DataView(dsInc.Tables["Units"]);
        dsInc.Tables["Units"].DefaultView.Sort = e.SortExpression;
        dvInc.Sort = e.SortExpression;
        GridViewInc.DataSource = dsInc;
        GridViewInc.DataBind();*/
        DataView dvInc = new DataView(dsInc.Tables["Units"]);
        dvInc.Sort = "Раздел";
        GridViewInc.DataSource = dvInc;
        GridViewInc.DataBind();
    }
}

При попытке сортировки вылетает Ошибка: DataTable must be set prior to using DataView.
Посмотрел, — в функции сортировки dsInc почему-то уже пустой. Можно, конечно,
раскомментировать, и заново получать данные из БД.. но разве это правильно? Датасет ведь уже
получили, надо только его отсортировать.
Подскажите почему dsInc пустой? Вообще, правильно так объявлять переменные, если хочешь их
использовать везде внутри класса?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.