新文章 网摘 文章 随笔 日记

datagridview的数据辅助选择窗口

 
  图片
 
本想重写DataGridViewColumn来实现上述功能,无奈在绑定数据后自定义事件总是无法触发,这个可能跟绑定数据有关。只好另觅他径。好不容易整出如上图这个东西,赶紧记录下来,以备后用。

一、新建一数据辅助窗口,即被调用者,代码如下:
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;

namespace Share
{
    public partial class Frm_DataBrowse : Form
    {
        private DataGridViewTextBoxEditingControl BrowserTextBox;
        private Timer T = new Timer();
        public Frm_DataBrowse(DataGridViewTextBoxEditingControl sender, Rectangle rect)
        {
            InitializeComponent();

 

            //以下通过设置一个时钟定时检测鼠标左键点击位置来隐藏弹出的模式对话框
            T.Interval = 100;
            T.Enabled = true;
            T.Tick += new EventHandler(T_Tick);

            BrowserTextBox = sender;
            dataGridView.ReadOnly = true;
            dataGridView.ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
            dataGridView.ContextMenuStrip.Items.Add("复制", null, Copy_OnClick);

            SetPosition( sender,  rect);
        }

        private void Copy_OnClick(object sender, EventArgs e)
        {
            string str = dataGridView.CurrentCell.Value.ToString();
            Clipboard.SetText(str);
        }

        /// <summary>
        /// 设置窗体位置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void SetPosition(DataGridViewTextBoxEditingControl sender, Rectangle rect)
        {
            //System.Type str = sender.GetType();
            this.BrowserTextBox = sender;
            this.StartPosition = FormStartPosition.Manual;

            int screenRight = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Right;
            int screenBottom = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Bottom;
            int screenTop = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Top;
            int screenLeft = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Left;

            if (rect.Left < screenLeft)
            {
                this.Left = screenLeft;
            }
            else if (rect.Left + this.Width > screenRight)
            {
                this.Left = rect.Right - this.Width;
            }
            else
            {
                this.Left = rect.Left;
            }

            if (rect.Top < screenTop)
            {
                this.Top = Math.Max(rect.Bottom + rect.Height - 7, screenTop);
            }
            else if (rect.Top + this.Height > screenBottom)
            {
                this.Top = Math.Min(rect.Top - this.Height, screenBottom - this.Height);
            }
            else
            {
                this.Top = rect.Bottom;
            }
        }

        private void T_Tick(object sender, EventArgs e)
        {
            //如果鼠标左键点击位置不在模式对话框范围内,则隐藏模式对话框
            if (!this.Bounds.Contains(Control.MousePosition) && Control.MouseButtons == MouseButtons.Left)
            {
                this.Hide();
            }
        }


        private void dataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            BrowserTextBox.Text = dataGridView.Rows[dataGridView.CurrentCell.RowIndex].Cells[0].Value.ToString();
            this.Hide();
        }

       
    }
}

二、新建一主窗口,即调用者,代码如下: 
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 MODEL.Program;
using MODEL.Department;
using BLL.Program;
using CustomUserControl;
using BLL.Order;
using BLL.Department;
using MODEL.Order;
using Share;
using System.Data.Common;
using System.Data.SqlClient;
using DAL.DbManager;
namespace NgeShoesPMC.Order
{
    public partial class Form_OrderReport : BaseForm
    {
        Frm_DataBrowse frm_Department;
        Frm_DataBrowse frm_OrderStatus;
        private int SelectedProgramID = -1;
        private int SelectedDepartmentID = -1;
        private int OldSelectedDepartmentID = -1;
        private int OldSelectedProgramID = -1;
        SqlConnection conn;
        SqlDataAdapter APT;
        DataSet OrderDataSet;
       
        public Form_OrderReport()
        {
            InitializeComponent();
            conn =(SqlConnection) DbHelper.getConn();
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            APT = new SqlDataAdapter(order_Oprate.SQL_ORDERDETAILS_SELECT_ORDERBY_ACTUALSTARTTIME, conn);//定义dataadapter
            SqlParameter p = new SqlParameter("@DepartmentID", SelectedProgramID);
            APT.SelectCommand.Parameters.Add(p);
            OrderDataSet = new DataSet();
            FillOrder();
        }
        /// <summary>
        /// 填入订单
        /// </summary>
        private void FillOrder()
        {
            OrderDataSet.Clear();
            APT.SelectCommand.Parameters["@DepartmentID"].Value = SelectedDepartmentID;
            APT.Fill(OrderDataSet);
            dataGridView1.DataSource = OrderDataSet.Tables[0];//完成数据绑定,datagridview可以显示数据源了
        }
        private void Form_OrderReport_Load(object sender, EventArgs e)
        {
            fillTreeView();
        }
        private void fillTreeView()
        {
            List<ProgramDetails> li = Program_Oprate.getProgramsAndDepartments();
            Cursor.Current = Cursors.WaitCursor;
            tv_Department.BeginUpdate();
            tv_Department.Nodes.Clear();
            foreach (ProgramDetails p in li)
            {
                tv_Department.Nodes.Add(new TreeNode(p.ProgramName + "_p" + p.ID));
                foreach (DepartmentDetails dpt in p.Departments)
                {
                    tv_Department.Nodes[li.IndexOf(p)].Nodes.Add(
                      new TreeNode(dpt.DepartmentName + "_d" + dpt.ID));
                }
            }
            Cursor.Current = Cursors.Default;
            tv_Department.EndUpdate();
        }

        private DataTable GetDataTable(int ProgramID)
        {
            DataTable dt = Department_Oprate.getAllDepartmentsIdAndNamByProgramID(ProgramID);
            return dt;
        }
        private void tv_Department_DoubleClick(object sender, EventArgs e)
        {
            string nodeText = tv_Department.SelectedNode.Text;
            int idx = nodeText.IndexOf("_d");
            if (idx >= 0)
            {
                SelectedDepartmentID = Convert.ToInt32(nodeText.Substring(idx + 2));
                DataTable dt = order_Oprate.getOrderDetailsOrderByActualStartTime(SelectedDepartmentID);
                TreeView tv = (TreeView)sender;
                SelectedProgramID = Convert.ToInt32(tv.SelectedNode.Parent.Text.Substring(tv.SelectedNode.Parent.Text.IndexOf("_p") + 2));
            }
            if (OldSelectedDepartmentID != SelectedDepartmentID)
            {
                //dataGridView1.DataSource = order_Oprate.getOrderDetailsOrderByActualStartTime(SelectedDepartmentID);
                FillOrder();
                OldSelectedDepartmentID = SelectedDepartmentID;
            }
            if (OldSelectedProgramID != SelectedProgramID)
            {
                OldSelectedProgramID = SelectedProgramID;
                if (frm_Department != null)
                {
                    frm_Department.dataGridView.DataSource = GetDataTable(SelectedProgramID);
                }
            }
        }

 

        private void Form_OrderReport_Resize(object sender, EventArgs e)
        {
            panel1.Width = this.Width - tv_Department.Right - 40;
            panel1.Height = this.Height - panel1.Top - 30;
        }


        /// <summary>
        /// 部门ID数据弹出窗口事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DepartID_BrowseData(DataGridViewTextBoxEditingControl sender, Rectangle rect)
        {
            //dataGridView1.CurrentCell.Value = "100000";

            if (frm_Department == null)
            {
                frm_Department = new Frm_DataBrowse(sender, rect);
                frm_Department.dataGridView.DataSource = GetDataTable(SelectedProgramID);
            }
            if (frm_Department.Visible == false)
            {
                frm_Department.SetPosition(sender, rect);
                frm_Department.ShowDialog();
            }
        }


        private void OrderStatus_Browse(DataGridViewTextBoxEditingControl sender, Rectangle rect)
        {
            if (frm_OrderStatus == null)
            {
                frm_OrderStatus = new Frm_DataBrowse(sender, rect);
                frm_OrderStatus.dataGridView.DataSource = order_Oprate.getOrderStatus();
            }
            if (frm_OrderStatus.Visible == false)
            {
                frm_OrderStatus.SetPosition(sender, rect);
                frm_OrderStatus.ShowDialog();
            }
        }

 

        //重写按键命令处理程序,以截获dataGridView编辑状态下的按键。
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            base.ProcessCmdKey(ref msg, keyData);
            int WM_KEYDOWN = 256;
            int WM_SYSKEYDOWN = 260;
            bool _disable = false;
            if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)
            {
                switch (keyData)
                {
                    case Keys.Enter:
                        OnEnter();
                        _disable = true;
                        break;
                    case Keys.F7:
                        OnF7();
                        _disable = true;
                        break;
                }
            }
            return _disable;
        }

        //按回车时
        protected void OnEnter()
        {
            switch (dataGridView1.CurrentCell.ColumnIndex)
            {
                //是物料名称栏按回车时
                case 7:
                    SendKeys.Send("{Tab}");
                    break;
                default:
                    SendKeys.Send("{Tab}");
                    break;
            }
        }
        //按F7时
        protected void OnF7()
        {
            if (dataGridView1.CurrentCell != null && dataGridView1.IsCurrentCellInEditMode)
            {
                DataGridViewTextBoxEditingControl sender =(DataGridViewTextBoxEditingControl) dataGridView1.EditingControl;
                Rectangle rect =dataGridView1.RectangleToScreen( dataGridView1.GetCellDisplayRectangle(dataGridView1.CurrentCell.ColumnIndex,
                    dataGridView1.CurrentCell.RowIndex, true));
                string DataPropertyName = dataGridView1.CurrentCell.OwningColumn.DataPropertyName.ToLower();
                switch (DataPropertyName)
                {
                    case "departmentid":
                        DepartID_BrowseData(sender, rect);
                        break;
                    case "orderstatus":
                        OrderStatus_Browse(sender, rect);
                        break;
                    default:
                        break;
                }
            }

        }

        private void dataGridView1_CellValidated(object sender, DataGridViewCellEventArgs e)
        {
            SqlCommandBuilder cb = new SqlCommandBuilder(APT);//此命令自动生成相关新增、删除、更新command
            APT.Update(OrderDataSet);//更新数据源
        }
     
    }
}

 

 以后copy这些代码适当修改修改就可以直接使用啦。     
posted @ 2021-07-27 22:19  岭南春  阅读(127)  评论(0)    收藏  举报