【问题标题】:Add a Control to autogenerated ColumnHeader of DataGrid in WPF getting data from SQLite database将控件添加到 WPF 中从 SQLite 数据库获取数据的 DataGrid 的自动生成的 ColumnHeader
【发布时间】:2020-05-06 08:36:01
【问题描述】:

我需要为从 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 是真的,所以我得到这样的东西:

数据显示在左侧数据网格中。 在右侧列表框中,我使用

收集生成的列标题
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    lb.Items.Add(e.Column.Header.ToString());
}

正如我所说,我想在每个这样的标题文本旁边的标题行中创建类似 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>

在标题中自动创建按钮正在使用:

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

最后一个问题:

没有为第一列标题创建按钮,我不知道为什么:

想法?

【问题讨论】:

  • 你指的是什么HeaderText?可能有几行但只有一个列标题。那么你想从哪里获取标题中的文本呢?
  • @mm8 我不想引用自动生成的 HeaderText。这是我的问题:我从哪里获得标题文本?或者更确切地说,我需要它吗?我需要做的就是在每个 HeaderText 旁边添加一个按钮。

标签: wpf sqlite datagrid


【解决方案1】:

您可以在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;
};

【讨论】:

  • 这看起来不错。谢谢到目前为止。但我还有两个挑战:1.如何为创建的按钮注册点击事件? 2.没有为第一列标题创建按钮,我不知道为什么:/
  • @Udineska: 1. 就像您为任何其他按钮注册事件处理程序一样:button.Click += ...。 2. 您是否在 XAML 中定义了任何其他列?请张贴您的第一列目前的样子。
  • @Udineska:你有没有尝试增加第一列的宽度?如果你在AutoGeneratingColumn 中放一个断点,它会被命中多少次?每列应该是一个。
  • 我做到了。增加宽度显示相同。如果我设置断点,它会跳过第一列。不知道为什么...
  • @Udineska:如果你没有打第一列的断点,这意味着它不是自动生成的,即你自己在某个地方添加它。
【解决方案2】:

在 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
}

【讨论】:

  • 出现错误:未定义命名空间前缀“主题”。 WPF 项目不支持“DataGridHeaderBorder”。
猜你喜欢
  • 2017-10-06
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多