Добавить элемент управления в автоматически сгенерированный заголовок столбца DataGrid в WPF, получая данные из базы данных SQLite - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно создать фильтр типа Excel для моих данных, импортированных из базы данных SQLite.

Импорт и отображение данных из базы данных хорошо работают с

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 истинно, так что я получите что-то вроде этого:

enter image description here

Данные отображаются в левой сетке данных. В списке справа я собираю сгенерированные заголовки столбцов с помощью

private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    lb.Items.Add(e.Column.Header.ToString());
}

Как я уже сказал, я хочу создать кнопки фильтра, подобные Excel, в строке заголовка рядом с каждым текстом заголовка, подобным этому

enter image description here

На сайте 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

последняя проблема:

кнопка не создается для заголовка первого столбца, и я не знаю почему:

enter image description here

идей?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вы можете установить для свойства Header столбца значение Panel в обработчике событий AutoGeneratingColumn:

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;
};
0 голосов
/ 13 мая 2020

Отредактируйте свой ColumnHeaderStyle в xaml

        <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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...