C# WPF DataGrid行内编辑

41 篇文章 0 订阅
13 篇文章 2 订阅

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

1、数据

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

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")//判断是编辑哪个字段
                {
                    classPowerSwitchLists[dataGrid.SelectedIndex].PowerON = newValue;
                }
                else
                {
                    classPowerSwitchLists[dataGrid.SelectedIndex].PowerOFF = newValue;
                }
                //保存到ini
                PowerSwitch_SaveDataGridToINI();
            }
            else
            {
                MessageBox.Show("输入错误,格式应为(“00:00”至“23:59”)","错误",MessageBoxButton.OK,MessageBoxImage.Error);
                //找到编辑前的值
                var OLD_textBox = cp.Content as classPowerSwitchList;
                //改为以前的数值
                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();
}
……

最终效果:

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beiger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值