我有一个应用程序需要显示一组由某些外部条件过滤的行。由于我不在这里解释的原因,我真的不想从DataGrid绑定的DataTable中删除行。要过滤列表,我正在折叠我不想显示的行。这很好用,直到用户对DataGrid进行排序。排序完成后,折叠的行再次突然可见。我查找了一个Sorted事件,以便我可以重新折叠我需要的行,但只有一个Sorting事件。我试图在每个DataGridRow上使用IsVisibleChanged,但这似乎没有被触发。我该如何解决这个问题?
以下是该问题的简单演示:
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>
运行程序后,您将看到一个只有数字3的DataGrid。点击“第1列”按列排序,注意您现在有数字1,2和3.
非常感谢任何解决此问题的帮助。
答案 0 :(得分:1)
我认为你应该专注于过滤DataTable而不是DataGridView。你有没有尝试过使用DataView?你可以用它们来过滤你的DataTable,当你有一个绑定的DataGridView时,View会在GridView中反映出来吗?
通过过滤DataTable,您不会删除任何行,只是简单地改变它的外观。
这是一个可能有用的链接: -
http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx
我希望这会有所帮助。