这节内容很简单,本来不打算写的,有群友技术群问了,所以就整理了下写出来了。这节实例是给datagrid添加右键操作菜单,接下来开始正文讲解。
01—数据模型
这里模型比较简单,就定义一个学生类,定义三个属性,分别是id、姓名、性别,如下:这里重写了tostring方法,方便打印
代码语言:javascript复制 [AddINotifyPropertyChangedInterface]
public class Students : PropertyChangedBase
{
private int id;
public int Id
{
get { return id; }
set
{
id = value;
}
}
public string Name { get; set; }
private int age;
public int Age
{
get { return age; }
set
{
age = value;
if(age < 16 || age > 21 )
{
AgeValidate = true;
}
else
{
AgeValidate = false;
}
}
}
public bool AgeValidate { get; set; }
public override string ToString()
{
StringBuilder report = new StringBuilder();
report.AppendLine($"[Id] = [{Id}]");
report.AppendLine($"[Name] = [{Name}]");
report.AppendLine($"[Age] = [{Age}]");
report.AppendLine($"[AgeValidate] = [{AgeValidate}]");
return report.ToString();
}
}
02—前台绑定
这里写了一个datagrid控件,然后菜单绑定ContextMenu="{Binding menu1}"
采用行选择的模式,如果要单元格选择模式这样操作:
代码语言:javascript复制 SelectionMode="Single" SelectionUnit="Cell"
右键事件绑定:
代码语言:javascript复制 cal:Message.Attach="[Event MouseRightButtonDown]=[datagrid_MouseRightButtonDown($source,$eventArgs)];"
代码语言:javascript复制 <DataGrid Name="dgSourceData" AutoGenerateColumns="False" ItemsSource="{Binding StudentList}"
ContextMenu="{Binding menu1}" RowHeaderWidth="30" SelectedItem ="{Binding SelectedItems}"
cal:Message.Attach="[Event MouseRightButtonDown]=[datagrid_MouseRightButtonDown($source,$eventArgs)];"
CellEditEnding="dgSourceData_BeginningEdit" SelectionChanged="dgSourceData_SelectionChanged" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{ Binding Path=Name}" MinWidth="68"/>
<DataGridTemplateColumn Header="Age" MinWidth="68" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Age,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Foreground="{Binding AgeValidate,Converter={StaticResource ShowColorConverter}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Id" Binding="{ Binding Path=Id}" MinWidth="48"/>
</DataGrid.Columns>
</DataGrid>
03—后台处理
代码语言:javascript复制 public System.Windows.Controls.DataGrid dGrid { get; set; }
public System.Windows.Controls.ContextMenu menu1 { get; set; }
public string BrowseDataSavePath { get; set; } = @"D:Temporary";
后台逻辑很简单,感觉也没啥好讲的,详看代码,不懂得加我微信zls20210502咨询,或者来我技术群讨论
代码语言:javascript复制 /// <summary>
/// 右键删除数据
/// </summary>
/// <param name="sender">对象</param>
/// <param name="e">事件</param>
public void datagrid_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
dGrid = (System.Windows.Controls.DataGrid)sender;
menu1 = new System.Windows.Controls.ContextMenu();
System.Windows.Controls.MenuItem menuitemFunc1 = new System.Windows.Controls.MenuItem();
System.Windows.Controls.MenuItem menuitemFunc2 = new System.Windows.Controls.MenuItem();
System.Windows.Controls.MenuItem menuitemFunc3 = new System.Windows.Controls.MenuItem();
menuitemFunc1.Header = "移动到此位置";
menuitemFunc2.Header = "删除此行信息";
menuitemFunc3.Header = "导出数据";
menuitemFunc1.Click = MoveToPostion_Click;
menuitemFunc2.Click = DeleteRow_Click;
menuitemFunc3.Click = ExportData_Click;
menu1.Items.Add(menuitemFunc1);
menu1.Items.Add(menuitemFunc2);
menu1.Items.Add(menuitemFunc3);
menu1.StaysOpen = true;
}
/// <summary>
/// 点击删除后的事件
/// </summary>
/// <param name="sender">对象</param>
/// <param name="e">事件</param>
public void DeleteRow_Click(object sender, RoutedEventArgs e)
{
StudentList.RemoveAt(dGrid.SelectedIndex);
}
/// <summary>
/// 移动到当前选定的位置
/// </summary>
/// <param name="sender">对象</param>
/// <param name="e">事件</param>
public void MoveToPostion_Click(object sender, RoutedEventArgs e)
{
try
{
//此方法省略;
System.Windows.MessageBox.Show("机台已成功移动到当前坐标");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
/// <summary>
/// 导出datagrid表格中的数据
/// </summary>
/// <param name="sender">对象</param>
/// <param name="e">事件</param>
public void ExportData_Click(object sender, RoutedEventArgs e)
{
BrowseSavePath();
}
/// <summary>
/// 导出地址浏览
/// </summary>
public void BrowseSavePath()
{
FolderBrowserDialog browserDialog = new FolderBrowserDialog();
browserDialog.Description = "请选择路径";
try
{
if (browserDialog.ShowDialog() == DialogResult.OK)
{
if (string.IsNullOrEmpty(browserDialog.SelectedPath))
{
System.Windows.MessageBox.Show("文件夹路径不能为空");
return;
}
BrowseDataSavePath = browserDialog.SelectedPath;
DataExport(BrowseDataSavePath);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public void DataExport(string path)
{
//此方法省略;
System.Windows.MessageBox.Show("数据已成功导出");
}
04—效果演示
05—源码下载
百度网盘下载链接: https://pan.baidu.com/s/1pXr-uIa-MDpaOPeN0G0GVg 提取码:1314