2011-01-13 4 views
1

У моего клиента есть это требование: alt text т. Е. Сетка со складными колоннами. Самый простой способ, который я нашел, состоит в том, чтобы иметь 3 отдельных datagrids и 2 кнопки, отображая или сворачивая решетки.Примените сортировку datagrid к другому datagrid

Вот ассоциированная XAML:

<StackPanel Orientation="Horizontal" Grid.Column="2" Grid.Row="0" VerticalAlignment="Stretch"> 

      <toolkit:DataGridDragDropTarget VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch"> 

       <sdk:DataGrid Name="Grid1" SelectionChanged="Grid_SelectionChanged" AutoGenerateColumns="False"> 
        <sdk:DataGrid.Columns> 
         <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader" /> 
         <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader" /> 
         <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader"/> 
         <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader" /> 
        </sdk:DataGrid.Columns> 
       </sdk:DataGrid> 

      </toolkit:DataGridDragDropTarget> 

      <Button Content=">" Click="Button_Click" Name="btn1" /> 
      <sdk:DataGrid Name="Grid2" SelectionChanged="Grid_SelectionChanged" AutoGenerateColumns="False" ItemsSource="{Binding ItemsSource, ElementName=Grid1}"> 
       <sdk:DataGrid.Columns> 
        <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" /> 
        <sdk:DataGridCheckBoxColumn Header="someheader" Binding="{Binding somefield}" /> 
        <sdk:DataGridCheckBoxColumn Header="someheader" Binding="{Binding somefield}" /> 
        <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" /> 
        <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" /> 
       </sdk:DataGrid.Columns> 
      </sdk:DataGrid> 

      <Button Content=">" Name="btn2" Click="Button_Click"/> 
      <sdk:DataGrid Name="Grid3" SelectionChanged="Grid_SelectionChanged" AutoGenerateColumns="False" ItemsSource="{Binding ItemsSource, ElementName=Grid1}"> 
       <sdk:DataGrid.Columns> 
        <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" /> 
       </sdk:DataGrid.Columns> 
      </sdk:DataGrid> 

     </StackPanel> 

Это работает правильно. Моя проблема возникает, когда я хочу сортировать одну из сетки. Поскольку сортировка является внутренней для datagrid, изменения не распространяются на другие (даже жесткие они связаны с одним и тем же источником!).

Есть ли способ «развести» сортировку на другие решетки? Я попытался найти способ перехватить событие сортировки, но он, похоже, не существует ...

Заранее благодарен!

ответ

1

Зачем использовать 3 базы данных? Лучше всего использовать только одну базу данных и страницу параметров, где человек может скрывать свои столбцы. вы можете скрыть до столбцов, используя DataGrid.Columns[0].Visibility = Visibility.Collapsed.

Вы можете сделать это с помощью кнопки над столбцом .. или флажка где-нибудь ... или страницы параметров. Много оппортуутов. Единственным недостатком является то, что это невозможно реализовать в MVVM, поскольку DataGridColumn не поддерживает привязку видимости.

В ответ на ваш вопрос:

Возможно, эта информация поможет вам, просто применить сортировку обоих DataGrids

private void Sort_DataGrid(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e) 
{ 
    // Never use Queries like this always use Stored procedures 

    SqlCommand myCommand = new SqlCommand("SELECT * FROM Categories", myConnection);                
    myCommand.CommandType = CommandType.Text; 
    SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand); 
    DataSet ds = new DataSet(); 
    myAdapter.Fill(ds,"Categories"); 
    DataView dv = new DataView(ds.Tables["Categories"]); 
    if((numberDiv%2) == 0) 
     dv.Sort = e.SortExpression + " " + "ASC"; 
    else 
     dv.Sort = e.SortExpression + " " + "DESC"; 
    numberDiv++; 
    myDataGrid.DataSource = dv; 
    myDataGrid.DataBind(); 
} 

Источник: http://www.codeproject.com/KB/webforms/SortingDataGridColumns.aspx

+0

Вопрос о Silverlight. –

+0

По-прежнему считаю, что лучше использовать 1 datagrid и изменить видимость столбцов. Это избавит вас от проблем с поиском сортировки вашего datagrid, так как невозможно применить сортировку к datagrid программно, если вы не отсортируете источник привязки. Таким образом, невозможно изменить событие в сортировке данных, так как невозможно применить сортировку с помощью C#/silverlight (привязка) к datacolumn. (Опять же, если не сделано для источника данных) –

+0

Хорошо спасибо, спецификации изменились, и кнопки внутри Grid исчезли, и вместо этого они предлагают то, что вы сказали (единственная кнопка, которая скрывает/показывает дополнительные столбцы). В любом случае, спасибо за это :-) – Shimrod

1
  1. Если вы будете придерживаться этих трех Решение DataGrid. Думаю, вам лучше обернуть их в элемент управления и добавить к этому элементу некоторые кнопки сортировки. Кнопки должны запускать сортировку ВСЕХ данных.

  2. Другой способ - использовать 1 DataGrid и изменить видимость столбцов (столбцов), которые вы хотите скрыть.

Смежные вопросы