在 WPF 从 SQLite 数据库中获取数据时,将控件添加到 DataGrid 的自动生成的 ColumnHeader
Add a Control to autogenerated ColumnHeader of DataGrid in WPF getting data from SQLite database
我需要为从 SQLite 数据库导入的数据创建一个类似于 excel 的过滤器。
使用
从数据库导入和显示数据效果很好
private void UpdateDataGrid(SQLiteConnection con, string sql)
{
DataSet dataSet = new DataSet();
SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con);
dataAdapter.Fill(dataSet);
dgMaterials.ItemsSource = dataSet.Tables[0].DefaultView;
}
AutoGenerateColumns 为真,因此我得到如下信息:
数据显示在左侧数据网格中。
在右侧列表框中,我收集生成的列 headers 和
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
lb.Items.Add(e.Column.Header.ToString());
}
如我所说,我想在每个 header 文本旁边的 header 行中创建类似 excel 的过滤器按钮
在 XAML 网站上,我是这样开始的
<DataGrid x:Name="dgMaterials"
IsReadOnly="True"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CanUserSortColumns="False"
DockPanel.Dock="Left" AutoGeneratingColumn="dg_AutoGeneratingColumn"
AlternatingRowBackground="LightGray">
... input a button next to every header text ...
</DataGrid>
Headers 中的按钮自动创建适用于:
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
////string headertext = e.Column.Header.ToString();
//StackPanel sp = new StackPanel();
//TextBlock tb = new TextBlock();
//tb.Text = e.Column.Header.ToString();
//sp.Children.Add(tb);
dgMaterials.AutoGeneratingColumn += (ss, ee) =>
{
Button b = new Button() { Content = "...", Name = "btn_" + ee.PropertyName };
b.Click += HeaderFilterButtonClick;
StackPanel stackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
stackPanel.Children.Add(new TextBlock() { Text = ee.PropertyName, VerticalAlignment = VerticalAlignment.Center });
//stackPanel.Children.Add(new Button() { Content = "...", Name = "btn_" + ee.PropertyName });
stackPanel.Children.Add(b);
ee.Column.Header = stackPanel;
};
lb.Items.Add(e.Column.Header.ToString());
}
感谢@mm8
上一题:
没有为第一列创建按钮 header,我不知道为什么:
想法?
您可以在 AutoGeneratingColumn
事件处理程序中将列的 Header
属性 设置为 Panel
:
dgMaterials.AutoGeneratingColumn += (ss, ee) =>
{
StackPanel stackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
stackPanel.Children.Add(new TextBlock() { Text = ee.PropertyName, VerticalAlignment = VerticalAlignment.Center });
stackPanel.Children.Add(new Button() { Content = "..." });
ee.Column.Header = stackPanel;
};
在 xaml
中编辑您的 ColumnHeaderStyle
<Style x:Key="DataGridColumnHeaderStyle1" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}">
<StackPanel Orientation="Horizontal">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<Button Content="..." Margin="2" Click="Button_Click"/>
</StackPanel>
</Themes:DataGridHeaderBorder>
<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
...
<DataGrid ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}"/>
private void Button_Click(object sender, RoutedEventArgs e)
{
//what you want to do on the filter click
}
我需要为从 SQLite 数据库导入的数据创建一个类似于 excel 的过滤器。
使用
从数据库导入和显示数据效果很好private void UpdateDataGrid(SQLiteConnection con, string sql)
{
DataSet dataSet = new DataSet();
SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(sql, con);
dataAdapter.Fill(dataSet);
dgMaterials.ItemsSource = dataSet.Tables[0].DefaultView;
}
AutoGenerateColumns 为真,因此我得到如下信息:
数据显示在左侧数据网格中。 在右侧列表框中,我收集生成的列 headers 和
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
lb.Items.Add(e.Column.Header.ToString());
}
如我所说,我想在每个 header 文本旁边的 header 行中创建类似 excel 的过滤器按钮
在 XAML 网站上,我是这样开始的
<DataGrid x:Name="dgMaterials"
IsReadOnly="True"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CanUserSortColumns="False"
DockPanel.Dock="Left" AutoGeneratingColumn="dg_AutoGeneratingColumn"
AlternatingRowBackground="LightGray">
... input a button next to every header text ...
</DataGrid>
Headers 中的按钮自动创建适用于:
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
////string headertext = e.Column.Header.ToString();
//StackPanel sp = new StackPanel();
//TextBlock tb = new TextBlock();
//tb.Text = e.Column.Header.ToString();
//sp.Children.Add(tb);
dgMaterials.AutoGeneratingColumn += (ss, ee) =>
{
Button b = new Button() { Content = "...", Name = "btn_" + ee.PropertyName };
b.Click += HeaderFilterButtonClick;
StackPanel stackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
stackPanel.Children.Add(new TextBlock() { Text = ee.PropertyName, VerticalAlignment = VerticalAlignment.Center });
//stackPanel.Children.Add(new Button() { Content = "...", Name = "btn_" + ee.PropertyName });
stackPanel.Children.Add(b);
ee.Column.Header = stackPanel;
};
lb.Items.Add(e.Column.Header.ToString());
}
感谢@mm8
上一题:
没有为第一列创建按钮 header,我不知道为什么:
想法?
您可以在 AutoGeneratingColumn
事件处理程序中将列的 Header
属性 设置为 Panel
:
dgMaterials.AutoGeneratingColumn += (ss, ee) =>
{
StackPanel stackPanel = new StackPanel() { Orientation = Orientation.Horizontal };
stackPanel.Children.Add(new TextBlock() { Text = ee.PropertyName, VerticalAlignment = VerticalAlignment.Center });
stackPanel.Children.Add(new Button() { Content = "..." });
ee.Column.Header = stackPanel;
};
在 xaml
中编辑您的 ColumnHeaderStyle <Style x:Key="DataGridColumnHeaderStyle1" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" SeparatorVisibility="{TemplateBinding SeparatorVisibility}">
<StackPanel Orientation="Horizontal">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<Button Content="..." Margin="2" Click="Button_Click"/>
</StackPanel>
</Themes:DataGridHeaderBorder>
<Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}"/>
<Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
...
<DataGrid ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}"/>
private void Button_Click(object sender, RoutedEventArgs e)
{
//what you want to do on the filter click
}