1. 程式人生 > >RepositoryItemComboBox獲得焦點彈出下拉框

RepositoryItemComboBox獲得焦點彈出下拉框

在dev中的gridcontrol中添加了一列RepositoryItemComboBox下拉框列,想要實現當RepositoryItemComboBox列獲得焦點的時候,自動彈出下拉框,今天研究了一天,終於有結果了,先上圖

主要思路實現如下

1.先讓滑鼠游標移到到RepositoryItemComboBox下拉單元格

2.然後模擬滑鼠的單擊事件

using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        List<User> list = new List<User>();
        public Form2()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 頁面載入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form2_Load(object sender, EventArgs e)
        {
            repositoryItemComboBox1.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;

            repositoryItemComboBox1.Items.Add("請選擇");
            repositoryItemComboBox1.Items.Add("男");
            repositoryItemComboBox1.Items.Add("女");
            list.Add(new User { Id = 1, UserName = "張三", Sex = 0, SexDes = "男" });
            list.Add(new User { Id = 2, UserName = "李四", Sex = 0, SexDes = "男" });
            list.Add(new User { Id = 3, UserName = "趙婭", Sex = 1, SexDes = "女" });
            list.Add(new User { Id = 3, UserName = "王林", Sex = -1, SexDes = "請選擇" });
            this.gridControl1.DataSource = list;
            
        }


        /// <summary>
        /// 獲取選擇的內容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < gridView1.RowCount; i++)
            {
                User user = (User)gridView1.GetRow(i);
                if (user.SexDes=="請選擇")
                {
                    user.Sex = -1;
                }
                if (user.SexDes == "男")
                {
                    user.Sex =0;
                }
                if (user.SexDes == "女")
                {
                    user.Sex =1;
                }
                MessageBox.Show(user.SexDes);
            }
        }

        /// <summary>
        /// 再gridview_keyup裡面做事件判斷
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridView1_KeyUp(object sender, KeyEventArgs e)
        {
            //當用戶操作鍵盤上的tab鍵和上下左右鍵的時候,
            if ((e.KeyCode == Keys.Tab||e.KeyCode == Keys.Right || e.KeyCode == Keys.Left || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down) && gridView1.FocusedColumn.FieldName == "SexDes")
            {
                  GridView view = sender as GridView;
                GridViewInfo vi = view.GetViewInfo() as GridViewInfo;
                GridDataRowInfo rowInfo = vi.RowsInfo.GetInfoByHandle(gridView1.FocusedRowHandle) as GridDataRowInfo;
                if (rowInfo != null)
                {
                    //獲取RepositoryItemComboBox下拉單元格資訊
                    GridCellInfo cellInfo = rowInfo.Cells[3];
                    //將下拉單元格所在的相對座標轉換為螢幕的絕對座標
                    Point p = this.PointToScreen(new Point(this.gridControl1.Location.X + cellInfo.CellValueRect.X, this.gridControl1.Location.Y + cellInfo.CellValueRect.Y));
                    //設定滑鼠位置
                    if (view.IndicatorWidth > 0 && gridView1.ColumnPanelRowHeight > 0)
                    {
                        MouseFlag.SetCursorPos(p.X + view.IndicatorWidth, p.Y + gridView1.ColumnPanelRowHeight);
                    }
                    else
                    {
                        MouseFlag.SetCursorPos(p.X+5 , p.Y);
                    }
                    //單擊RepositoryItemComboBox下拉單元格
                    MouseFlag.MouseLefDownEvent(0, 0, 0);  
                }
            }
        }

    }


    public class User
    {
        public int Id { get; set; }

        /// <summary>
        /// 名稱
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 性別0男 1女,-1請選擇
        /// </summary>
        public int Sex { get; set; }

        /// <summary>
        /// 描述
        /// </summary>
        public string SexDes { get; set; }
    
    }


    /// <summary>
    /// 滑鼠操作相關類
    /// </summary>
    public class MouseFlag
    {
        [DllImport("user32.dll")]
        static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);

        [Flags]
        enum MouseEventFlag : uint
        {
            Move = 0x0001,
            LeftDown = 0x0002,
            LeftUp = 0x0004,
            RightDown = 0x0008,
            RightUp = 0x0010,
            MiddleDown = 0x0020,
            MiddleUp = 0x0040,
            XDown = 0x0080,
            XUp = 0x0100,
            Wheel = 0x0800,
            VirtualDesk = 0x4000,
            Absolute = 0x8000
        }

        /// <summary>
        /// 模擬滑鼠單擊事件
        /// </summary>
        /// <param name="dx"></param>
        /// <param name="dy"></param>
        /// <param name="data"></param>
        public static void MouseLefDownEvent(int dx, int dy, uint data)
        {
            mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, dx, dy, data, UIntPtr.Zero);
        }

        /// <summary>
        /// 設定滑鼠位置
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        [DllImport("User32")]
        public extern static void SetCursorPos(int x, int y);

        /// <summary>
        /// 獲取滑鼠位置
        /// </summary>
        /// <param name="lpPoint"></param>
        /// <returns></returns>
        [DllImport("User32")]
        public extern static bool GetCursorPos(ref Point lpPoint);

    }


}