您的位置:首页 > 其它

RepositoryItemComboBox获得焦点弹出下拉框

2017-01-16 17:55 239 查看
在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);

}

}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DevExpress