WPF C# 在datagrid里可以添加行每添加一行序号+1可以删除行有10列第一列是TextBlock列名叫序号第二、三列是DatePicker列名叫开始日期、结束日期第四列是ComboBox列名叫电源设备下拉框有20行从设备1~设备20第五列是ComboBox列名叫端口号有个PreviewMouseLeftButtonDown事件获取当前电脑的串口号第六列是ComboBox列名叫功率瓦数
,列名叫状态,显示电源设备的开关状态。
以下是示例代码:
XAML代码:
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Margin="10">
<Button Content="添加行" Click="AddRow_Click"/>
<Button Content="删除行" Click="DeleteRow_Click"/>
</StackPanel>
<DataGrid Grid.Row="1" x:Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="序号" Binding="{Binding Index}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="开始日期">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding StartDate, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="结束日期">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding EndDate, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="电源设备">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding PowerDevices}" SelectedItem="{Binding SelectedPowerDevice, Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="端口号">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding SerialPorts}" SelectedItem="{Binding SelectedSerialPort, Mode=TwoWay}" PreviewMouseLeftButtonDown="SerialPorts_PreviewMouseLeftButtonDown"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="功率瓦数">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding PowerValues}" SelectedItem="{Binding SelectedPowerValue, Mode=TwoWay}" PreviewMouseLeftButtonDown="PowerValues_PreviewMouseLeftButtonDown" SelectionChanged="PowerValues_SelectionChanged"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="泵温度" Binding="{Binding PumpTemperature, Mode=TwoWay}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="功率值" Binding="{Binding PowerValue, Mode=TwoWay}" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTemplateColumn Header="开关">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding SwitchButtonText}" Click="SwitchButton_Click"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="状态">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding PowerDeviceStatusImage}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
C#代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace WpfApp1
{
public partial class MainWindow : Window
{
private List<DataItem> dataItems = new List<DataItem>();
private List<string> powerDevices = new List<string> { "设备1", "设备2", "设备3", "设备4", "设备5", "设备6", "设备7", "设备8", "设备9", "设备10", "设备11", "设备12", "设备13", "设备14", "设备15", "设备16", "设备17", "设备18", "设备19", "设备20" };
private List<string> powerValues = new List<string> { "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" };
private List<string> serialPorts = new List<string>();
private SerialPort serialPort;
public MainWindow()
{
InitializeComponent();
// 初始化串口列表
serialPorts = SerialPort.GetPortNames().ToList();
// 绑定数据
dataGrid.ItemsSource = dataItems;
}
private void AddRow_Click(object sender, RoutedEventArgs e)
{
int index = dataItems.Count + 1;
dataItems.Add(new DataItem(index, powerDevices, powerValues));
RefreshIndex();
}
private void DeleteRow_Click(object sender, RoutedEventArgs e)
{
if (dataGrid.SelectedItems.Count > 0)
{
foreach (var item in dataGrid.SelectedItems)
{
dataItems.Remove((DataItem)item);
}
RefreshIndex();
}
}
private void RefreshIndex()
{
for (int i = 0; i < dataItems.Count; i++)
{
dataItems[i].Index = i + 1;
}
}
private void SerialPorts_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// 刷新串口列表
serialPorts = SerialPort.GetPortNames().ToList();
ComboBox comboBox = (ComboBox)sender;
comboBox.ItemsSource = serialPorts;
}
private void PowerValues_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
ComboBox comboBox = (ComboBox)sender;
DataItem dataItem = (DataItem)comboBox.DataContext;
// 如果未选择电源设备,则提示先选择电源设备
if (string.IsNullOrEmpty(dataItem.SelectedPowerDevice))
{
MessageBox.Show("请先选择电源设备!");
return;
}
// 刷新功率瓦数列表
powerValues = new List<string> { "10", "20", "30", "40", "50", "60", "70", "80", "90", "100" };
if (dataItem.SelectedPowerDevice == "设备1")
{
powerValues = new List<string> { "10", "20", "30", "40", "50" };
}
else if (dataItem.SelectedPowerDevice == "设备2")
{
powerValues = new List<string> { "20", "40", "60", "80", "100" };
}
else if (dataItem.SelectedPowerDevice == "设备3")
{
powerValues = new List<string> { "30", "60", "90" };
}
comboBox.ItemsSource = powerValues;
}
private void PowerValues_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox comboBox = (ComboBox)sender;
DataItem dataItem = (DataItem)comboBox.DataContext;
// 更新功率值
dataItem.PowerValue = comboBox.SelectedItem.ToString();
}
private void SwitchButton_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
DataItem dataItem = (DataItem)button.DataContext;
// 更新电源设备状态
if (dataItem.PowerDeviceStatus == PowerDeviceStatus.On)
{
dataItem.PowerDeviceStatus = PowerDeviceStatus.Off;
dataItem.SwitchButtonText = "开";
dataItem.PowerDeviceStatusImage = new BitmapImage(new Uri("pack://application:,,,/Images/off.png"));
}
else
{
dataItem.PowerDeviceStatus = PowerDeviceStatus.On;
dataItem.SwitchButtonText = "关";
dataItem.PowerDeviceStatusImage = new BitmapImage(new Uri("pack://application:,,,/Images/on.png"));
}
}
}
public class DataItem : INotifyPropertyChanged
{
private int index;
private DateTime startDate;
private DateTime endDate;
private List<string> powerDevices;
private string selectedPowerDevice;
private List<string> powerValues;
private string selectedPowerValue;
private string pumpTemperature;
private string powerValue;
private PowerDeviceStatus powerDeviceStatus;
private string switchButtonText;
private BitmapImage powerDeviceStatusImage;
public int Index
{
get { return index; }
set
{
index = value;
OnPropertyChanged("Index");
}
}
public DateTime StartDate
{
get { return startDate; }
set
{
startDate = value;
OnPropertyChanged("StartDate");
}
}
public DateTime EndDate
{
get { return endDate; }
set
{
endDate = value;
OnPropertyChanged("EndDate");
}
}
public List<string> PowerDevices
{
get { return powerDevices; }
}
public string SelectedPowerDevice
{
get { return selectedPowerDevice; }
set
{
selectedPowerDevice = value;
OnPropertyChanged("SelectedPowerDevice");
}
}
public List<string> PowerValues
{
get { return powerValues; }
}
public string SelectedPowerValue
{
get { return selectedPowerValue; }
set
{
selectedPowerValue = value;
OnPropertyChanged("SelectedPowerValue");
}
}
public string PumpTemperature
{
get { return pumpTemperature; }
set
{
pumpTemperature = value;
OnPropertyChanged("PumpTemperature");
}
}
public string PowerValue
{
get { return powerValue; }
set
{
powerValue = value;
OnPropertyChanged("PowerValue");
}
}
public PowerDeviceStatus PowerDeviceStatus
{
get { return powerDeviceStatus; }
set
{
powerDeviceStatus = value;
OnPropertyChanged("PowerDeviceStatus");
}
}
public string SwitchButtonText
{
get { return switchButtonText; }
set
{
switchButtonText = value;
OnPropertyChanged("SwitchButtonText");
}
}
public BitmapImage PowerDeviceStatusImage
{
get { return powerDeviceStatusImage; }
set
{
powerDeviceStatusImage = value;
OnPropertyChanged("PowerDeviceStatusImage");
}
}
public DataItem(int index, List<string> powerDevices, List<string> powerValues)
{
this.index = index;
this.startDate = DateTime.Now;
this.endDate = DateTime.Now;
this.powerDevices = powerDevices;
this.powerValues = powerValues;
this.powerDeviceStatus = PowerDeviceStatus.Off;
this.switchButtonText = "开";
this.powerDeviceStatusImage = new BitmapImage(new Uri("pack://application:,,,/Images/off.png"));
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public enum PowerDeviceStatus
{
On,
Off
}
}
``
原文地址: https://www.cveoy.top/t/topic/efI1 著作权归作者所有。请勿转载和采集!