WPF可编辑的DataGrid根据条件控制最后一行的按钮显示隐藏

发布于:2025-03-15 ⋅ 阅读:(19) ⋅ 点赞:(0)

如下图,可编辑的DataGrid,如果有操作按钮,则最后一行会异常出现按钮;解决办法就是让代码动态生成按钮;
在这里插入图片描述

页面代码

<Page x:Class="WpfSnqkGasAnalysis.PageUser"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:WpfSnqkGasAnalysis.Model;assembly=WpfSnqkGasAnalysis.Model" 
      xmlns:local1="clr-namespace:WpfSnqkGasAnalysis"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="PageUser" Loaded="Page_Loaded">
    <Page.Resources>
        <local1:ImgShowConvert x:Key="imgShow"></local1:ImgShowConvert>       
        <local1:CheckNullConvert x:Key="accountIsReadOnly" />
    
    </Page.Resources>
    <Grid Margin="10">       
        <Grid.RowDefinitions>
            <RowDefinition Height="60" ></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <DockPanel LastChildFill="False" Grid.Row="0">
            <Label Content="账号:" Style="{StaticResource Label1}"  />
            <TextBox  x:Name="txtAccount" Text="" Style="{StaticResource input1}" Margin="0,0,20,0" />
            <Button x:Name="btnSearch" Content="查询"  Style="{StaticResource buttonBlue}" HorizontalAlignment="Left" VerticalAlignment="Center" Click="btnSearch_Click"/>
        </DockPanel>
        <Grid Grid.Row="1"   >
            <DataGrid  x:Name="dgUser"  ItemsSource="{Binding }"  Style="{StaticResource DataGrid1}" ColumnHeaderStyle="{StaticResource DataGrid1_header}"  RowHeaderWidth="0"  BorderBrush="#D3D3D3" BorderThickness="1,0,0,0"  AutoGenerateColumns="False" SelectionUnit="Cell" CanUserAddRows="True" CellEditEnding="dgUser_CellEditEnding"   >
                <DataGrid.Columns>
                    <DataGridTextColumn ElementStyle="{StaticResource dataGridColumn}" Width="150" Header="账号" Binding="{Binding  Account }" IsReadOnly="{Binding Path=Account,Converter={StaticResource accountIsReadOnly}}"   ></DataGridTextColumn>
                    <DataGridTextColumn   ElementStyle="{StaticResource dataGridColumn}" Width="100" Header="姓名" Binding="{Binding Realname,Mode=TwoWay}"></DataGridTextColumn>
                    <!--<DataGridComboBoxColumn   Width="200" Header="角色" TextBinding="{Binding Role_id,Mode=TwoWay }"  ItemsSource="{x:Static  local:CommonConfig.RoleList  }" SelectedItemBinding="{Binding  Role_id,UpdateSourceTrigger=PropertyChanged}"   />-->
                   
                    <!--<DataGridCheckBoxColumn      Width="90"  Header="是否启用" Binding="{Binding Dstat,Mode=TwoWay}"  ></DataGridCheckBoxColumn>-->
                    <DataGridTemplateColumn  Header="是否启用" Width="90">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel   Loaded="CheckStackPanel_Loaded"  Tag="{Binding Dstat}"  Orientation="Horizontal" Style="{StaticResource StackPanel_buttonSpance}">
                                   
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>


                    <DataGridTemplateColumn Header="电子签名"  >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>                                            
                                <Image Source="{Binding SignatureImgPath,Converter={StaticResource imgShow} }" MaxHeight="60" ></Image>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn ElementStyle="{StaticResource dataGridColumn}" Width="100"   Header="备注" Binding="{Binding Remark,Mode=TwoWay}"></DataGridTextColumn>
                    <DataGridTemplateColumn  Header="操作" Width="*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Name="btnList"  Loaded="btnList_Loaded"  Tag="{Binding Id}"  Orientation="Horizontal" Style="{StaticResource StackPanel_buttonSpance}">
                                    <!--<TextBlock Text="{Binding Id}" Background="#D77DE1" Padding="10,2"></TextBlock>-->

                                    <!--<Button  Name="btnEdit" Tag="{Binding Id}" HorizontalAlignment="Left"   Visibility="{Binding Id, ConverterParameter=99, Converter={StaticResource lastRowC}  }"  VerticalAlignment="Center" Content="上传电子签名"   Click="BtnImgName_Click"  />
                                    <Button  Name="btnPasswordReset" Tag="{Binding Id}" HorizontalAlignment="Left" Visibility="{Binding Id, ConverterParameter=99, Converter={StaticResource lastRowC}  }"  VerticalAlignment="Center" Content="重置密码"   Click="ResetPassword_Click"  />
                                    <Button  Name="btnDel"   HorizontalAlignment="Left" VerticalAlignment="Center" Content="删除" Visibility="{Binding Id, ConverterParameter=99, Converter={StaticResource lastRowC}  }"   Click="del_Click"  />-->
                           
                                </StackPanel>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Grid>   
</Page>

后台代码

using Microsoft.VisualBasic.ApplicationServices;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfRepairProject.IBLL;
using WpfRepairProject.IData;
using WpfRepairProject.Model;
using WpfSnqkGasAnalysis.IBusiness_impl;
using WpfSnqkGasAnalysis.Model;

namespace WpfSnqkGasAnalysis
{
    /// <summary>
    /// PageUser.xaml 的交互逻辑,账号管理
    /// </summary>
    public partial class PageUser : Page
    {
        public PageUser()
        {
            InitializeComponent();
        }
        //UserBusiness userBusiness = new UserBusiness();

        readonly IK_userDAL userDAL = ServicesRepairHelpter.GetService<IK_userDAL>();
        readonly IUserBLL userBLL = ServicesRepairHelpter.GetService<IUserBLL>();

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            //dgUser
            var list = userDAL.GetListAll();
            if (list?.Count > 0)
            {
                foreach (var item in list)
                {
                    item.Dstat = item.U_stat == 1 ? true : false;
                }
            }
            dgUser.ItemsSource = list;
            //   dgUser.
            //dgUser.
            //dgUser.row
        }

        //回车键提交,或者鼠标点击其他单元格
        private void dgUser_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            var user = e.Row.Item as K_user;
            object selectedValue = null;
            if (e.EditingElement is TextBox)
            {
                selectedValue = ((System.Windows.Controls.TextBox)e.EditingElement).Text;
            }



            List<string> updateColumns = new List<string>();

            //账号。
            if (e.Column.SortMemberPath.Equals("Account"))
            {

                user.Account = selectedValue.ToString();
                updateColumns.Add("Account");
            }
            else if (e.Column.SortMemberPath.Equals("Realname"))
            {
                user.Realname = selectedValue.ToString();
                updateColumns.Add("Realname");
            }
            //角色
            else if (e.Column.SortMemberPath.Equals("User_role_id"))
            {
                var selectedValue1 = ((System.Windows.Controls.Primitives.Selector)e.EditingElement).SelectedValue as string;
                user.User_role_id = selectedValue1.ToMyInt64();
                updateColumns.Add("User_role_id");
            }
            //备注
            else if (e.Column.SortMemberPath.Equals("Remark"))
            {
                user.Remark = selectedValue.ToString();
                updateColumns.Add("Remark");
            }
            //状态
            else if (e.Column.SortMemberPath.Equals("Dstat"))
            {
                bool? check = ((System.Windows.Controls.Primitives.ToggleButton)e.EditingElement).IsChecked;
                user.U_stat = 2;
                if (check != null)
                {
                    user.U_stat = check.Value ? 1 : 2;
                }
                updateColumns.Add("U_stat");
            }
            if (selectedValue == null || string.IsNullOrEmpty(selectedValue.ToString()))
            {
                return;
            }
            if (user.Id == 0)
            {

                //新增一个人。//添加时间:2022-12-6 17:35:58
                K_user userInfo = new K_user();
                userInfo.Account = selectedValue.ToString();
                var addResult = userBLL.Add(userInfo);

                btnSearch_Click(sender, new RoutedEventArgs());//刷新列表数据


                ShowAlertHelpter.ShowAlert(addResult.Msg);
            }
            else
            {
                if (updateColumns.Count == 1 && updateColumns.First() == "Account")
                {
                    ShowAlertHelpter.ShowAlert("账号不允许修改");
                    btnSearch_Click(sender, new RoutedEventArgs());//刷新列表数据
                    return;
                }

                //修改,保存
                var result = userBLL.Update(user, updateColumns);
                if (result.Code == ResultCode.Success.ToMyInt64())
                {
                    btnSearch_Click(sender, new RoutedEventArgs());//刷新列表数据
                }
                ShowAlertHelpter.ShowAlert(result.Msg);
            }

        }

        //搜索
        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {
            var list = userDAL.GetListAll();
            var listResult = list.Where(g => g.Account.Contains(txtAccount.Text.Trim())).ToList();

            if (listResult?.Count > 0)
            {
                foreach (var item in listResult)
                {
                    item.Dstat = item.U_stat == 1 ? true : false;
                }
            }

            //必须要List,否则不能编辑单元格
            dgUser.ItemsSource = listResult;
            dgUser.UpdateLayout();
        }

        //上传签名
        private void BtnImgName_Click(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
            ofd.Filter = "image|*.png";
            if ((bool)ofd.ShowDialog())
            {
                //保存图片
                string dir = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, CommonConfig.UploadImgSavePath);
                if (!System.IO.Directory.Exists(dir))
                {
                    System.IO.Directory.CreateDirectory(dir);
                }
                string file = DateTime.Now.Ticks + ".png";
                string fileSavePath = System.IO.Path.Combine(dir, file);
                var buffer = System.IO.File.ReadAllBytes(ofd.FileName);
                System.IO.File.WriteAllBytes(fileSavePath, buffer);

                //当前人,修改签名
                string relativePath = System.IO.Path.Combine(CommonConfig.UploadImgSavePath, file);
                //Login_user login_User = this.dgUser.SelectedItem as Login_user;
                var button = sender as Button;
                if (button != null)
                {
                    long id = (long)button.Tag.ToMyInt64();
                    var user = userDAL.Get(id);
                    if (user == null)
                    {
                        ShowAlertHelpter.ShowAlert("没找到用户");
                    }
                    user.SignatureImgPath = relativePath;
                    var taskUpdate = userDAL.UpdateAsync(user, new string[] { "SignatureImgPath" });
                    int count = taskUpdate.Result;

                    IResult result = new Result("签名图片保存失败");
                    if (count > 0)
                    {
                        result = new ResultSuccess();
                    }

                    if (result.Code == (int)ResultCode.Success)
                    {
                        btnSearch_Click(sender, e);//刷新列表数据
                        ShowAlertHelpter.ShowAlert("签名图片保存成功");
                    }
                    else
                    {
                        ShowAlertHelpter.ShowAlert(result.Msg);
                    }

                }

            }
        }

        //重置密码 //添加时间:2023-1-10 10:17:37。作者:王浩力
        private void ResetPassword_Click(object sender, RoutedEventArgs e)
        {
            WindowUserResetPassword windowUserReset = new WindowUserResetPassword();
            windowUserReset.selectedUser = this.dgUser.CurrentItem as K_user;
            windowUserReset.ShowDialog();

        }

        //删除用户
        private async void del_Click(object sender, RoutedEventArgs e)
        {
            var user = ((System.Windows.FrameworkElement)sender).DataContext as K_user;
            if (user == null)
            {
                e.Handled = true;
                return;
            }
            if (MessageBox.Show($"确认删除`{user.Account}`吗?", "删除提示", MessageBoxButton.YesNo) == MessageBoxResult.No
                )
            {
                e.Handled = true;
                return;
            }
            int count = await userDAL.DeleteByPrimaryKeyAsync(user.Id);
            if (count > 0)
            {
                ShowAlertHelpter.ShowAlert("删除成功");
                btnSearch_Click(sender, e);//刷新列表数据
            }

        }

        //按钮的StackPanel加载完成
        private void btnList_Loaded(object sender, RoutedEventArgs e)
        {
            //ShowAlertHelpter.ShowAlert("按钮容器加载完成");
            var conqi = sender as StackPanel;
            if (conqi == null || conqi.Tag == null || conqi.Tag.ToString() == "0")
            {
                return;
            }
            var row = conqi.Parent;

            Button button = new Button();
            button.Content = "重置密码";
            button.Click += ResetPassword_Click;
            button.Tag = conqi.Tag;
            conqi.Children.Add(button);

            Button button2 = new Button();
            button2.Content = "上传电子签名";
            button2.Click += BtnImgName_Click;
            button2.Tag = conqi.Tag;
            conqi.Children.Add(button2);

            Button button3 = new Button();
            button3.Content = "删除";
            button3.Click += del_Click;
            button3.Tag = conqi.Tag;
            conqi.Children.Add(button3);

        }

        //动态绑定checkbox
        private void CheckStackPanel_Loaded(object sender, RoutedEventArgs e)
        {
            var conqi = sender as StackPanel;
            if (conqi == null || conqi.Tag == null)
            {
                return;
            }

            CheckBox checkBox = new CheckBox();
            checkBox.IsChecked = (bool)conqi.Tag;
            checkBox.Click += (o, e) =>
            {
                var zuj = o as CheckBox;
                var user = zuj.DataContext as K_user;
                if (user == null)
                {
                    return;
                }
                if (MessageBox.Show($"确认修改用户`{user.Account}`状态吗"
                    , "提示"
                    , MessageBoxButton.OKCancel) != MessageBoxResult.OK)
                {
                    btnSearch_Click(sender, new RoutedEventArgs());//刷新列表数据
                    return;
                }

                user.U_stat = 1;
                if (zuj.IsChecked != null)
                {
                    user.U_stat = zuj.IsChecked.Value ? 1 : 2;
                }

                //修改,保存
                var result = userBLL.Update(user, new List<string> { "U_stat" });
                if (result.Code == ResultCode.Success.ToMyInt64())
                {
                    btnSearch_Click(sender, new RoutedEventArgs());//刷新列表数据
                }
                ShowAlertHelpter.ShowAlert(result.Msg);
            };
            conqi.Children.Add(checkBox);

        }
    }
}

动态生成按钮主要代码:

 //按钮的StackPanel加载完成
        private void btnList_Loaded(object sender, RoutedEventArgs e)
        {
            //ShowAlertHelpter.ShowAlert("按钮容器加载完成");
            var conqi = sender as StackPanel;
            if (conqi == null || conqi.Tag == null || conqi.Tag.ToString() == "0")
            {
                return;
            }
            var row = conqi.Parent;

            Button button = new Button();
            button.Content = "重置密码";
            button.Click += ResetPassword_Click;
            button.Tag = conqi.Tag;
            conqi.Children.Add(button);

            Button button2 = new Button();
            button2.Content = "上传电子签名";
            button2.Click += BtnImgName_Click;
            button2.Tag = conqi.Tag;
            conqi.Children.Add(button2);

            Button button3 = new Button();
            button3.Content = "删除";
            button3.Click += del_Click;
            button3.Tag = conqi.Tag;
            conqi.Children.Add(button3);

        }