2012-09-20 25 views
1

我有一個應用程序需要顯示一組行被一些外部條件過濾。由於我在這裏不解釋的原因,我不想從DataGrid綁定的DataTable中刪除行。要篩選列表,我正在摺疊不想顯示的行。這很好,直到用戶對DataGrid進行排序。排序完成後,摺疊的行會再次突然顯示。我查找了一個Sorted事件,以便我可以重新摺疊我需要的行,但只有一個Sorting事件。我試圖在每個DataGridRow上使用IsVisibleChanged,但這似乎並沒有被解僱。我該如何解決這個問題?如何防止DataGridRow更改時排序我的DataGrid?

這是問題的一個簡單的演示:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataTable table = new DataTable(); 
     table.Columns.Add("Column 1"); 

     DataRow row = table.NewRow(); 
     row[0] = "1"; 
     table.Rows.Add(row); 

     row = table.NewRow(); 
     row[0] = "2"; 
     table.Rows.Add(row); 

     row = table.NewRow(); 
     row[0] = "3"; 
     table.Rows.Add(row); 

     _grid.ItemsSource = table.AsDataView(); 
     _grid.DataContext = table; 
     _grid.Loaded += _grid_Loaded; 
    } 

    void _grid_Loaded(object sender, RoutedEventArgs e) 
    { 
     var dataGridRow = GetRow(_grid, 1); 
     dataGridRow.Visibility = Visibility.Collapsed; 

     dataGridRow = GetRow(_grid, 0); 
     dataGridRow.Visibility = Visibility.Collapsed; 
    } 

    public DataGridRow GetRow(DataGrid grid, int index) 
    { 
     var row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
     if (row == null) 
     { 
      // May be virtualized, bring into view and try again. 
      grid.UpdateLayout(); 
      if (grid.Items.Count > index) 
      { 
       grid.ScrollIntoView(grid.Items[index]); 
       row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); 
      } 
     } 
     return row; 
    } 
} 

這裏是XAML:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid HorizontalAlignment="Left" Margin="54,43,0,0" VerticalAlignment="Top" Height="216" Width="382" Name="_grid"/> 

</Grid> 

運行程序後,你會看到一個DataGrid只數3.單擊「列1」按列排序,注意您現在有數字1,2和3.

任何幫助解決這個問題將不勝感激。

回答

1

我想你應該專注於過濾DataTable而不是DataGridView。你有沒有嘗試過使用DataView?你可以使用這些來過濾你的DataTable,並且你有一個綁定的DataGridView,View會在GridView中反映出來?

通過篩選DataTable,您不會刪除任何行,只是簡單地改變它的外觀。

這裏有一個鏈接,可以幫助: -

http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

我希望這有助於。

+0

德里克,感謝您的快速回復。我現在檢查鏈接。 – guxiyou