找回密码
 立即注册

QQ登录

只需一步,快速开始

qiuzhilv007

中级会员

34

主题

85

帖子

620

积分

中级会员

积分
620

活字格认证微信认证勋章

qiuzhilv007
中级会员   /  发表于:2015-9-6 18:21  /   查看:15049  /  回复:12
大家好。
假设Cell绑定的项目是ID和NAME,数据为以下的样子。
ID         NAME
------------------
010       010:A
020       020:B
……
设定的属性为不能输入
GcComboBoxCell.DropDownStyle = MultiRowComboBoxStyle.DropDownList
在EditingControlShowing事件中自己绑定了KeyDown事件,
在keydown事件中实现监视键盘输入的ID,如连续输入的话,以连续输入的ID为KEY,在绑定的项目中检索。
检索到对应的项目后,让combobox显示对应的NAME。
假设只在键盘输入0后停止,则显示010:A。连续输入030时则显示030:C。
因combobox自带的自动检索不准确,所以自己实现了以上功能。但现在其自带的检索功能会影响代码实现的功能,导致在输入时乱跳到其中一个值,最后才选择了正确的值。
如何禁用其自动选择的功能呢?

使用的是Multirow8.0

12 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-9-7 10:55:00
沙发
回复 1楼qiuzhilv007的帖子

谢谢反馈。
从你的描述来看,我们不能模拟重现问题。
请提供一个重现问题的Demo,我们帮你看看。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
qiuzhilv007
中级会员   /  发表于:2015-9-7 11:26:00
板凳
谢谢回复。
因对Multirow进行了封装,所以比较难提供。
我描述的现象可以忽略,只想知道如何禁用在输入ID时GcCombobox自动去找对应项目的功能。
回复 使用道具 举报
dafo
版主   /  发表于:2015-9-7 11:51:00
地板
你可以尝试设置GcComboBoxCell.AutoCompleteMode = None, AutoCompleteSource = None, AutoSelect = false.
回复 使用道具 举报
qiuzhilv007
中级会员   /  发表于:2015-9-7 12:04:00
5#
回复 4楼dafo的帖子

这三个设置是默认设置,没有改变。现在就是这样设置的
:?
回复 使用道具 举报
qiuzhilv007
中级会员   /  发表于:2015-9-7 13:45:00
6#
回复 2楼Alice的帖子

附件上传不了,把代码贴上了。
往画面上拖一个GcMultirow,里面放一个GcComboBoxCell。属性默认即可。
运行后在GcComboBox上输入010,显示的不是010.它应该是自动匹配了两次0。所以他的自动匹配不准确。想要禁用。
如何禁用?

  1. Imports GrapeCity.Win.MultiRow.InputMan
  2. Imports GrapeCity.Win.MultiRow

  3. Public Class Form1

  4.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

  5.         init()

  6.     End Sub

  7.     Private Sub init()

  8.         Dim tp As Template = GcMultiRow1.Template

  9.         Dim gcComboBoxCell As GcComboBoxCell = GcMultiRow1.Template.Row.Cells(0)

  10.         gcComboBoxCell.ListColumns.Add("ID")
  11.         gcComboBoxCell.ListColumns.Add("NAME")
  12.         gcComboBoxCell.ListColumns(0).Width = 0
  13.         gcComboBoxCell.ListColumns(0).Visible = False

  14.         gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
  15.                           New SubItem(""),
  16.                           New SubItem("")}))
  17.         gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
  18.                           New SubItem("010"),
  19.                           New SubItem("010:A")}))
  20.         gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
  21.                           New SubItem("020"),
  22.                           New SubItem("020:B")}))
  23.         gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
  24.                           New SubItem("030"),
  25.                           New SubItem("030:C")}))
  26.         gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
  27.                           New SubItem("040"),
  28.                           New SubItem("040:D")}))

  29.         gcComboBoxCell.ValueSubItemIndex = 0
  30.         gcComboBoxCell.TextSubItemIndex = 1

  31.         gcComboBoxCell.ListHeaderPane.Visible = False

  32.         GcMultiRow1.Template = tp

  33.         GcMultiRow1.RowCount = 1
  34.     End Sub
  35. End Class
复制代码
回复 使用道具 举报
Leo
超级版主   /  发表于:2015-9-7 14:58:00
7#
  1. public partial class Form1 : Form, IMessageFilter
  2.     {
  3.         public Form1()
  4.         {
  5.             InitializeComponent();
  6.             Application.AddMessageFilter(this);
  7.         }
  8.         private GcComboBox _cbx;
  9.         private void Form1_Load(object sender, EventArgs e)
  10.         {
  11.             GcComboBox cbx = new GcComboBox();
  12.             _cbx = cbx;
  13.             cbx.ListColumns.Add(new ListColumn("ID"));
  14.             cbx.ListColumns.Add(new ListColumn("Name"));
  15.             cbx.Items.Add(new ListItem("", ""));
  16.             cbx.Items.Add(new ListItem("010", "010:A"));
  17.             cbx.Items.Add(new ListItem("020", "020:B"));
  18.             cbx.Items.Add(new ListItem("030", "030:C"));
  19.             cbx.Items.Add(new ListItem("040", "040:D"));
  20.             this.Controls.Add(cbx);
  21.             cbx.DropDownStyle = ComboBoxStyle.DropDownList;
  22.         }
  23.         public bool PreFilterMessage(ref Message m)
  24.         {
  25.             if (m.Msg == 0x0100) // WM_KEYDOWN
  26.             {
  27.                 if (_cbx.Focused || _cbx.DroppedDown)
  28.                 {
  29.                     // Add your customized logic here.
  30.                     return true;
  31.                 }
  32.             }
  33.             return false;
  34.         }
  35.     }
复制代码
GcComboBoxCell和标准的ComboBox/ListBox的策略一样,仅匹配首字母。
如果你有匹配前序多个字符的需求,看样子只能通过MessageFilter过滤掉部分的KeyDown事件。

使用InputMan写的代码示例如上所示。
希望能用的上。

注意:因为MessageFilter是针对整个Application的,所以,使用起来要比较小心。必须精确判断当前正在处理消息的是GcComboBoxCellEditor,并且已经DroppedDown了。

评分

参与人数 1金币 +700 满意度 +5 收起 理由
Alice + 700 + 5 多谢

查看全部评分

回复 使用道具 举报
qiuzhilv007
中级会员   /  发表于:2015-9-7 17:22:00
8#
回复 7楼Leo的帖子

感谢回复。
这种方法比较危险。因Multirow被封装,其中有很多对按键的动作单独处理。比如重写了OnKeyDown
且在GcComboBox编辑状态时是走不到PreFilterMessage中的,和keydown事件一样,只能在非编辑状态下走进去。
编辑时用的EditingControlShowing。感觉Multirow不好操作。
比GrapeCity.Win.ElTabelle.Sheet变得很复杂。
这个自动匹配的功能不能被禁用吗?
回复 使用道具 举报
Carl
版主   /  发表于:2015-9-7 17:59:00
9#
GcComboBox和.NET的标准ComboBox一样,实现的是首字匹配。在DropDown模式下按字母只会匹配Item中的第一个字母。所以按下010会匹配两次0.
这个功能没有公开的接口可以禁用。唯一的方式是截获GcComboBox的KeyDown事件不让他处理。
Leo给出的方案完全可行。不管是编辑状态还是非编辑状态,都可以走到PreFilterMessage。我们已经测试过。
如果你的PreFilterMessage在编辑状态走不到,我怀疑你的工程里对Windows Message有自己的处理,比如使用了Message Hook等底层技术。如果是这样,必须在你的代码里把Message派发正确才可以。

评分

参与人数 1金币 +200 收起 理由
Alice + 200 奖励200金币

查看全部评分

愿 Engine 归于沉寂,Timer 停止运动,Message Queue 不再流淌,Data Source 为我掌握
回复 使用道具 举报
qiuzhilv007
中级会员   /  发表于:2015-9-7 18:52:00
10#
回复 9楼Carl的帖子

PreFilterMessage确实在编辑状态也走。
我在PreFilterMessage开始判断是否获得焦点写错了,非编辑时GcMultirow.Focused是True,编辑时是False。
非常感谢各位斑竹的帮助。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部