目录
如下图,可编辑的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);
}