CWPFDataGrid行内编辑

科技玩点原始事 2024-02-20 21:16:02

DataGrid默认情况下就支持行内编辑,只不过比较简单,通常是显示用TextBlock,双击编辑时用TextBox,不过DataGrid支持模板自定义,编辑时使用其它控件,这样就可以实现更强大的功能。

1、数据

……publicPowerSwitchList{public String SwitcID { set; get; }public string SwitchWeek { set; get; }public String PowerON { set; get; }public String PowerOFF { set; get; }}……public List<classPowerSwitchList>PowerSwitchLists = new List<classPowerSwitchList>();……classPowerSwitchLists.Add(newPowerSwitchList() { SwitcID = "1", SwitchWeek = "一", PowerON = "07:30", PowerOFF = "18:00" });classPowerSwitchLists.Add(newPowerSwitchList() { SwitcID = "2", SwitchWeek = "二", PowerON = "07:30", PowerOFF = "18:00" });classPowerSwitchLists.Add(newPowerSwitchList() { SwitcID = "3", SwitchWeek = "三", PowerON = "07:30", PowerOFF = "18:00" });classPowerSwitchLists.Add(newPowerSwitchList() { SwitcID = "4", SwitchWeek = "四", PowerON = "07:30", PowerOFF = "18:00" });classPowerSwitchLists.Add(newPowerSwitchList() { SwitcID = "5", SwitchWeek = "五", PowerON = "07:30", PowerOFF = "18:00" });classPowerSwitchLists.Add(newPowerSwitchList() { SwitcID = "6", SwitchWeek = "六", PowerON = "07:30", PowerOFF = "18:00" });classPowerSwitchLists.Add(newPowerSwitchList() { SwitcID = "7", SwitchWeek = "日", PowerON = "07:30", PowerOFF = "18:00" });PowerSwitchList.ItemsSource = null;PowerSwitchList.ItemsSource =PowerSwitchLists;

2、xaml

<DataGrid x:Name="PowerSwitchList" ItemsSource="{Binding}" Margin="1" RowHeaderWidth="0"GridLinesVisibility="Horizontal" FontSize="14" AlternationCount="2"CanUserSortColumns="False" IsReadOnly="False" CanUserAddRows="False" AutoGenerateColumns="False"HorizontalContentAlignment="Center" VerticalContentAlignment="Center"CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False"BeginningEdit="PowerSwitchList_BeginningEdit" CellEditEnding="PowerSwitchList_CellEditEnding"><DataGrid.ColumnHeaderStyle><Style TargetType="DataGridColumnHeader"><Setter Property="HorizontalContentAlignment" Value="Center"/><Setter Property="FontWeight" Value="Bold"/></Style></DataGrid.ColumnHeaderStyle><DataGrid.CellStyle><Style TargetType="{x:Type DataGridCell}"><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="FontWeight" Value="Bold"/></Trigger></Style.Triggers></Style></DataGrid.CellStyle><DataGrid.RowStyle><Style TargetType="{x:Type DataGridRow}"><Setter Property="FontSize" Value="12"/><Setter Property="HorizontalAlignment" Value="Center"/><Setter Property="VerticalAlignment" Value="Center"/><Style.Triggers><Trigger Property="ItemsControl.AlternationIndex" Value="0"><Setter Property="Background" Value="#cbedfa" /></Trigger><Trigger Property="ItemsControl.AlternationIndex" Value="1"><Setter Property="Background" Value="#FFFFFFFF" /></Trigger><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#76d7fb"/></Trigger><Trigger Property="IsSelected" Value="True"><Setter Property="Background" Value="LightBlue"/><Setter Property="Foreground" Value="White"/></Trigger></Style.Triggers></Style></DataGrid.RowStyle><DataGrid.Resources></DataGrid.Resources><DataGrid.Columns><DataGridTemplateColumn Header="序号" Width="2*"><DataGridTemplateColumn.CellTemplate><DataTemplate><Label x:Name="SwitcID" Content="{Binding SwitcID}" FontSize="12" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Header="星期" Width="2*"><DataGridTemplateColumn.CellTemplate><DataTemplate><Label x:Name="SwitchWeek" Content="{Binding SwitchWeek}" FontSize="12" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Header="开机" Width="3*"><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock x:Name="PowerON" Text="{Binding PowerON}" ToolTip="双击修改" HorizontalAlignment="Center" VerticalAlignment="Center"/></DataTemplate></DataGridTemplateColumn.CellTemplate><DataGridTemplateColumn.CellEditingTemplate><DataTemplate><StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center"><TextBox x:Name="PowerON_Edit" Text="{Binding PowerON}" HorizontalAlignment="Center" VerticalAlignment="Center"/><Button x:Name="btnCancelEdit" Content="×" Height="18" Width="18" Click="btnCancelEdit_Click"/><Button x:Name="btnConfirmcEdit" Content="√" Height="18" Width="18" Click="btnConfirmcEdit_Click"/></StackPanel></DataTemplate></DataGridTemplateColumn.CellEditingTemplate></DataGridTemplateColumn><DataGridTemplateColumn Header="关机" Width="3*"><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock x:Name="PowerOFF" Text="{Binding PowerOFF}" ToolTip="双击修改" HorizontalAlignment="Center" VerticalAlignment="Center"/></DataTemplate></DataGridTemplateColumn.CellTemplate><DataGridTemplateColumn.CellEditingTemplate><DataTemplate><StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Center"><TextBox x:Name="PowerOFF_Edit" Text="{Binding PowerOFF}" HorizontalAlignment="Center" VerticalAlignment="Center"/><Button x:Name="btnCancelEdit" Content="×" Height="18" Width="18" Click="btnCancelEdit_Click"/><Button x:Name="btnConfirmcEdit" Content="√" Height="18" Width="18" Click="btnConfirmcEdit_Click"/></StackPanel></DataTemplate></DataGridTemplateColumn.CellEditingTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid>

3、代码

……private void PowerSwitchList_BeginningEdit(object sender, DataGridBeginningEditEventArgs e){ Console.WriteLine("开始编辑");}private void PowerSwitchList_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e){ //如果点击了放弃按钮或ESC if (e.EditAction == DataGridEditAction.Cancel) { return; } //获取编辑模式显示的元素,因为使用了模板,因此这里是ContentPresenter类型 ContentPresenter cp = e.EditingElement as ContentPresenter; if (cp != null && VisualTreeHelper.GetChildrenCount(cp) > 0) { //找到StackPanel StackPanel stackPanel = VisualTreeHelper.GetChild(cp, 0) as StackPanel; //再找到编辑框 TextBox textBox = VisualTreeHelper.GetChild(stackPanel, 0) as TextBox; //如果找到 if (textBox != null) { //新值 string newValue = textBox.Text; //获取表格对象 var dataGrid = sender as DataGrid; //判断输入是否符合要求 00:00-23:59 Regex regex = new Regex(@"([0-1][0-9]|2[0-3]):([0-5][0-9])"); if (regex.IsMatch(newValue)) { //从“:”两侧各取2个数字 string[] modifyNewValue = newValue.Split(':'); if (modifyNewValue[0].Length>2) { modifyNewValue[0] = modifyNewValue[0].Substring(modifyNewValue[0].Length - 2, 2); } newValue = modifyNewValue[0] + ":" + modifyNewValue[1].Substring(0, 2); textBox.Text = newValue; //修改列表 if (textBox.Name == "PowerON_Edit")//判断是编辑哪个字段 { PowerSwitchLists[dataGrid.SelectedIndex].PowerON = newValue; } else { PowerSwitchLists[dataGrid.SelectedIndex].PowerOFF = newValue; } //保存到ini PowerSwitch_SaveDataGridToINI(); } else { MessageBox.Show("输入错误,格式应为(“00:00”至“23:59”)","错误",MessageBoxButton.OK,MessageBoxImage.Error); //找到编辑前的值 var OLD_textBox = cp.Content asPowerSwitchList; //改为以前的数值 if (textBox.Name == "PowerON_Edit")//判断是编辑哪个字段 { textBox.Text = OLD_textBox.PowerON; } else { textBox.Text = OLD_textBox.PowerOFF; } //重新进入编辑状态 dataGrid.BeginEdit(); } } } }private void btnCancelEdit_Click(object sender, RoutedEventArgs e){ this.PowerSwitchList.CancelEdit();} private void btnConfirmcEdit_Click(object sender, RoutedEventArgs e){ this.PowerSwitchList.CommitEdit();}……

4、最终效果:

0 阅读:3

科技玩点原始事

简介:感谢大家的关注