RepositoryItemComboBox獲得焦點彈出下拉框
阿新 • • 發佈:2019-02-19
在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); } }