前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 添加右键菜单

C# 添加右键菜单

作者头像
用户9127601
发布2022-03-23 08:55:38
1.6K0
发布2022-03-23 08:55:38
举报
文章被收录于专栏:dotNET编程大全dotNET编程大全

这节内容很简单,本来不打算写的,有群友技术群问了,所以就整理了下写出来了。这节实例是给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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 dotNET编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01—数据模型
  • 02—前台绑定
  • 03—后台处理
  • 04—效果演示
  • 05—源码下载
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档