给DataGridView添加右键菜单

来源:互联网 发布:mac系统剪切 编辑:程序博客网 时间:2024/04/29 15:19

本人以前用PB做过一些开发,挺喜欢DATAWINDOW的。在学习C#时发现给DataGirdView加上右键菜单的效果和PB中的DATAWINDOW有相同的效果。其中数据库的操作应用的SQLDataAdatper,下面源码奉上,欢迎朋友们提出指正和意见。

 

首先,先建立一个Form窗口取名为DataGridViewDemo 从工具箱中选择控件,并设置属性如下

DataGridView   name属性 dataGridView

TextBox            name属性 txtContent

Button              name属性  btSave   Text 属性  保存

Button              name 属性 btExit     Text属性  退出

 

 

DataGridViewDemo 类代码如下

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace C15Demo
{
    public partial class DataGridViewDemo : Form
    {
        //全局变量
        private SqlDataAdapter adapter = null;
        private DataTable dt = null;
        public DataGridViewDemo()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 初始化SQLDataAdapter类添加对数据表的增删改操作
        /// </summary>
        private void InitAdapter()
        {
            SqlConnection connection = new SqlConnection();
            connection.ConnectionString = "Persist Security Info=false;Integrated Security=SSPI;Initial Catalog=Northwind;server=(local)";
            adapter = new SqlDataAdapter("select ProductID,ProductName,UnitPrice,Discontinued from Products", connection);
            adapter.FillLoadOption = LoadOption.OverwriteChanges;
            //添加修改命令
            SqlCommand UpdataCommand = new SqlCommand();
            UpdataCommand.Connection = connection;
            UpdataCommand.CommandText = "Update Products set ProductName = @ProductName,UnitPrice=@UnitPrice,Discontinued = @Discontinued where ProductID=@Productid ";
            UpdataCommand.Parameters.Add("@ProductID", SqlDbType.Int, 4, "ProductID");
            UpdataCommand.Parameters.Add("@ProductName", SqlDbType.VarChar, 50, "ProductName");
            UpdataCommand.Parameters.Add("@UnitPrice", SqlDbType.Money, 20, "UnitPrice");
            UpdataCommand.Parameters.Add("@Discontinued", SqlDbType.Bit, 1, "Discontinued");
            adapter.UpdateCommand = UpdataCommand;
            //添加新增
            SqlCommand InsertCommand = new SqlCommand();
            InsertCommand.Connection = connection;
            InsertCommand.CommandText = "Insert into Products (ProductName,UnitPrice,Discontinued)values(@ProductName,@UnitPrice,@Discontinued) ";
            InsertCommand.Parameters.Add("@ProductName", SqlDbType.VarChar, 50, "ProductName");
            InsertCommand.Parameters.Add("@UnitPrice", SqlDbType.Money, 20, "UnitPrice");
            InsertCommand.Parameters.Add("@Discontinued", SqlDbType.Bit, 1, "Discontinued");
            adapter.InsertCommand = InsertCommand;
            //添加删除
            SqlCommand DeleteCommand = new SqlCommand();
            DeleteCommand.Connection = connection;
            DeleteCommand.CommandText = "Delete Products where ProductID=@ProductID ";
            DeleteCommand.Parameters.Add("@ProductID", SqlDbType.Int, 4, "ProductID");
            adapter.DeleteCommand = DeleteCommand;

        }
        /// <summary>
        /// 初始化DataGridView并绑定列,给DataGridView添加右键菜单
        /// </summary>
        /// <param name="dataGridView">DataGrivView控件</param>
        private void InitDataGridView(DataGridView dataGridView)
        {
            dataGridView.AutoGenerateColumns = false;
            dataGridView.AllowUserToAddRows = false  ;
            dataGridView.AllowUserToDeleteRows = false  ;
            dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            dataGridView.EditMode = DataGridViewEditMode.EditOnEnter;
            dataGridView.MultiSelect = false;
            dataGridView.ScrollBars = ScrollBars.Vertical;
            dataGridView.VirtualMode = true;
            //添加列
            DataGridViewTextBoxColumn Column1 = new DataGridViewTextBoxColumn();
            Column1.DataPropertyName = "ProductID";
            Column1.HeaderText = "产品 ID";
            Column1.Name = "Column1";
            //Column1.ReadOnly = true;
            DataGridViewTextBoxColumn Column2 = new DataGridViewTextBoxColumn();
            Column2.DataPropertyName = "ProductName";
            Column2.HeaderText = "产品名称";
            Column2.Name = "Column2";
            Column2.Width = 165;
            DataGridViewTextBoxColumn Column3 = new DataGridViewTextBoxColumn();
            Column3.DataPropertyName = "UnitPrice";
            Column3.HeaderText = "价格";
            Column3.Name = "Column3";
            DataGridViewCheckBoxColumn Column4 = new DataGridViewCheckBoxColumn();
            Column4.DataPropertyName = "Discontinued";
            Column4.HeaderText = "是否使用";
            Column4.Name = "Column4";

            dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { Column1, Column2, Column3 ,Column4 });
            //添加右键菜单
            ContextMenuStrip contextMenuStrip = new ContextMenuStrip();
            contextMenuStrip.ShowCheckMargin = false;
            contextMenuStrip.ShowImageMargin = false;
            contextMenuStrip.ShowItemToolTips = true;
            contextMenuStrip.TextDirection = ToolStripTextDirection.Horizontal;
            contextMenuStrip.Opening += new CancelEventHandler(contextMenuStrip_Opening);
            dataGridView.ContextMenuStrip = contextMenuStrip;
            dataGridView.CurrentCellChanged += new EventHandler(dataGridView_CurrentCellChanged);
        }
        /// <summary>
        /// 右键菜单委拖的Opening事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        void contextMenuStrip_Opening(object sender, CancelEventArgs e)
        {
            //throw new NotImplementedException();
            ContextMenuStrip contextMenuStrip = sender as ContextMenuStrip;
            if (contextMenuStrip != null)
            {
                //判断是否有菜单项,如果没有就添加
                if (contextMenuStrip.Items.Count == 0)
                {
                    ToolStripMenuItem addMenuItem = new ToolStripMenuItem();
                    addMenuItem.Text = "添加";
                    //addMenuItem.ImageIndex = 0 //添加图片
                    //将菜单单击事件委托
                    addMenuItem.Click += new EventHandler(addMenuItem_Click);
                    ToolStripMenuItem deleteMenuItem = new ToolStripMenuItem();
                    deleteMenuItem.Text = "删除";
                    deleteMenuItem.Click += new EventHandler(deleteMenuItem_Click);
                    ToolStripMenuItem insertMenuItem = new ToolStripMenuItem();
                    insertMenuItem.Text = "插入";
                    insertMenuItem.Click += new EventHandler(insertMenuItem_Click);
                    contextMenuStrip.Items.Add(addMenuItem);
                    contextMenuStrip.Items.Add(deleteMenuItem);
                    contextMenuStrip.Items.Add(insertMenuItem);
                }
            }
        }
        /// <summary>
        /// 插入菜单的委拖事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void insertMenuItem_Click(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            //throw new NotImplementedException();
            ToolStripMenuItem toolStripMenuItem = sender as ToolStripMenuItem;
            ContextMenuStrip contextMenuStrip = toolStripMenuItem.Owner as ContextMenuStrip;
            if (contextMenuStrip != null)
            {
                //获取目标控件
                DataGridView dataGridView = contextMenuStrip.SourceControl as DataGridView;
                if (dataGridView.CurrentRow.Index > 0)
                {
                    //因为不能直接在dataGridView1上添加一个空行,所以给dt数据源添加一个空行然后重新绑定
                    DataRow dr = dt.NewRow ();
                    dt.Rows.InsertAt (dr,dataGridView.CurrentRow.Index );
                    dataGridView.DataSource = dt;
                }
            }
        }

        void deleteMenuItem_Click(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            ToolStripMenuItem toolStripMenuItem = sender as ToolStripMenuItem;
            ContextMenuStrip contextMenuStrip = toolStripMenuItem.Owner as ContextMenuStrip;
            if (contextMenuStrip != null)
            {
                //获取目标控件
                DataGridView dataGridView = contextMenuStrip.SourceControl as DataGridView;
                if (dataGridView.CurrentRow.Index > 0)
                {
                    dataGridView.Rows.RemoveAt(dataGridView.CurrentRow.Index);
                }
            }
        }
        /// <summary>
        /// 添加菜单的委拖事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void addMenuItem_Click(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            ToolStripMenuItem toolStripMenuItem = sender as ToolStripMenuItem;
            ContextMenuStrip contextMenuStrip = toolStripMenuItem.Owner as ContextMenuStrip;
            if (contextMenuStrip != null)
            {
                //获取目标控件
                DataGridView dataGridView = contextMenuStrip.SourceControl as DataGridView;
                //dataGridView.Rows.Add();
                //因为不能直接在dataGridView1上添加一个空行,所以给dt数据源添加一个空行然后重新绑定
                DataRow dr = dt.NewRow();
                dt.Rows.Add(dr);
                dataGridView.DataSource = dt;
            }
        }
        /// <summary>
        /// 删除菜单的委拖事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void dataGridView_CurrentCellChanged(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            if (this.dataGridView1.CurrentCell != null)
            {
                this.txtContent.Text = this.dataGridView1.CurrentCell.Value.ToString();
               
               
            }
        }
        /// <summary>
        /// 保存按钮的单击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                adapter.Update(dt);
                MessageBox.Show("更新成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        /// <summary>
        /// 窗口控件加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataGridViewDemo_Load(object sender, EventArgs e)
        {
            //初始化Adapter全局变量
            this.InitAdapter();
            //初始化dataGridView1控件
            this.InitDataGridView(dataGridView1);
            dt = new DataTable();
           
            try
            {
                //获取数据并填充到DataTable
                adapter.Fill(dt);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            //给dataGridView1控件绑定数据源
            this.dataGridView1.DataSource = dt;
        }
    }
}