本文介绍如何使用 WPF 的 DataGrid 创建一个表格,该表格支持添加行、删除行,并自动更新行号。表格包含多个列,包括日期选择、下拉菜单、文本框、按钮和图片。示例代码涵盖了 XAML 和 C# 部分,并解释了关键步骤和代码逻辑。

WPF 代码:

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="序号" Binding="{Binding Number}" />
        <DataGridTemplateColumn Header="开始日期">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <DatePicker SelectedDate="{Binding StartDate}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="结束日期">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <DatePicker SelectedDate="{Binding EndDate}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="电源设备">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding PowerDevices}" SelectedItem="{Binding SelectedPowerDevice}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="端口号">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding PortNumbers}" SelectedItem="{Binding SelectedPortNumber}" PreviewMouseLeftButtonDown="OnPortNumberPreviewMouseLeftButtonDown" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="功率瓦数">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding PowerValues}" SelectedItem="{Binding SelectedPowerValue}" PreviewMouseLeftButtonDown="OnPowerValuePreviewMouseLeftButtonDown" SelectionChanged="OnPowerValueSelectionChanged" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="泵温度" Binding="{Binding PumpTemperature}" />
        <DataGridTextColumn Header="功率值" Binding="{Binding Power}" />
        <DataGridTemplateColumn Header="开关">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Content="{Binding SwitchText}" Click="OnSwitchButtonClick" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="图片">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Source="{Binding ImagePath}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

C# 代码:

public partial class MainWindow : Window
{
    private ObservableCollection<DataItem> dataItems;

    public MainWindow()
    {
        InitializeComponent();

        dataItems = new ObservableCollection<DataItem>();
        dataGrid.ItemsSource = dataItems;
    }

    private void OnAddButtonClick(object sender, RoutedEventArgs e)
    {
        int number = dataItems.Count + 1;
        dataItems.Add(new DataItem(number));
    }

    private void OnDeleteButtonClick(object sender, RoutedEventArgs e)
    {
        if (dataGrid.SelectedItem != null)
        {
            dataItems.Remove((DataItem)dataGrid.SelectedItem);
        }
    }

    private void OnPortNumberPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        // 获取当前电脑的串口号
        // ...
    }

    private void OnPowerValuePreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        // ...
    }

    private void OnPowerValueSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // ...
    }

    private void OnSwitchButtonClick(object sender, RoutedEventArgs e)
    {
        // ...
    }
}

public class DataItem
{
    public int Number { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public ObservableCollection<string> PowerDevices { get; set; }
    public string SelectedPowerDevice { get; set; }
    public ObservableCollection<string> PortNumbers { get; set; }
    public string SelectedPortNumber { get; set; }
    public ObservableCollection<string> PowerValues { get; set; }
    public string SelectedPowerValue { get; set; }
    public string PumpTemperature { get; set; }
    public string Power { get; set; }
    public string SwitchText { get; set; }
    public string ImagePath { get; set; }

    public DataItem(int number)
    {
        Number = number;
        StartDate = DateTime.Now;
        EndDate = DateTime.Now;
        PowerDevices = new ObservableCollection<string>()
        {
            '设备1', '设备2', '设备3', '设备4', '设备5', '设备6', '设备7', '设备8', '设备9', '设备10',
            '设备11', '设备12', '设备13', '设备14', '设备15', '设备16', '设备17', '设备18', '设备19', '设备20'
        };
        SelectedPowerDevice = '设备1';
        PortNumbers = new ObservableCollection<string>();
        for (int i = 1; i <= 10; i++)
        {
            PortNumbers.Add('COM' + i);
        }
        SelectedPortNumber = 'COM1';
        PowerValues = new ObservableCollection<string>()
        {
            '100瓦', '200瓦', '300瓦', '400瓦', '500瓦', '600瓦', '700瓦', '800瓦', '900瓦', '1000瓦'
        };
        SelectedPowerValue = '100瓦';
        PumpTemperature = "";
        Power = "";
        SwitchText = '开';
        ImagePath = "";
    }
}

示例代码中包含了以下关键内容:

  • 使用 DataGrid 创建表格,并通过 AutoGenerateColumns 属性禁用自动生成列。
  • 使用 DataGridTextColumn 和 DataGridTemplateColumn 创建表格列,并绑定数据到相应的属性。
  • 使用 ComboBox 创建下拉菜单,并绑定数据到相应的属性。
  • 使用 DatePicker 创建日期选择器,并绑定数据到相应的属性。
  • 使用 Button 创建按钮,并绑定事件到相应的事件处理方法。
  • 使用 Image 创建图片,并绑定数据到相应的属性。
  • 使用 ObservableCollection 管理数据,并通过 ItemsSource 属性绑定到 DataGrid。
  • 使用 C# 代码实现添加行、删除行、更新行号、处理事件等操作。

本文提供的代码示例仅供参考,您可以根据实际需求进行修改和扩展。

WPF DataGrid 实例:添加行、删除行、序号自增、日期选择、下拉菜单、事件处理

原文地址: https://www.cveoy.top/t/topic/gvhE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录