qiuzhilv007 发表于 2015-9-6 18:21:00

GcCombobox如何禁用其自动选择对应项目的功能

大家好。
假设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

Alice 发表于 2015-9-7 10:55:00

回复 1楼qiuzhilv007的帖子

谢谢反馈。
从你的描述来看,我们不能模拟重现问题。
请提供一个重现问题的Demo,我们帮你看看。

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

回复 4楼dafo的帖子

这三个设置是默认设置,没有改变。现在就是这样设置的
:?

qiuzhilv007 发表于 2015-9-7 13:45:00

回复 2楼Alice的帖子

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

Imports GrapeCity.Win.MultiRow.InputMan
Imports GrapeCity.Win.MultiRow

Public Class Form1

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

      init()

    End Sub

    Private Sub init()

      Dim tp As Template = GcMultiRow1.Template

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

      gcComboBoxCell.ListColumns.Add("ID")
      gcComboBoxCell.ListColumns.Add("NAME")
      gcComboBoxCell.ListColumns(0).Width = 0
      gcComboBoxCell.ListColumns(0).Visible = False

      gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
                        New SubItem(""),
                        New SubItem("")}))
      gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
                        New SubItem("010"),
                        New SubItem("010:A")}))
      gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
                        New SubItem("020"),
                        New SubItem("020:B")}))
      gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
                        New SubItem("030"),
                        New SubItem("030:C")}))
      gcComboBoxCell.Items.Add(New ListItem(New SubItem() {
                        New SubItem("040"),
                        New SubItem("040:D")}))

      gcComboBoxCell.ValueSubItemIndex = 0
      gcComboBoxCell.TextSubItemIndex = 1

      gcComboBoxCell.ListHeaderPane.Visible = False

      GcMultiRow1.Template = tp

      GcMultiRow1.RowCount = 1
    End Sub
End Class

Leo 发表于 2015-9-7 14:58:00

public partial class Form1 : Form, IMessageFilter
    {
      public Form1()
      {
            InitializeComponent();

            Application.AddMessageFilter(this);
      }

      private GcComboBox _cbx;

      private void Form1_Load(object sender, EventArgs e)
      {
            GcComboBox cbx = new GcComboBox();

            _cbx = cbx;
            cbx.ListColumns.Add(new ListColumn("ID"));
            cbx.ListColumns.Add(new ListColumn("Name"));

            cbx.Items.Add(new ListItem("", ""));
            cbx.Items.Add(new ListItem("010", "010:A"));
            cbx.Items.Add(new ListItem("020", "020:B"));
            cbx.Items.Add(new ListItem("030", "030:C"));
            cbx.Items.Add(new ListItem("040", "040:D"));

            this.Controls.Add(cbx);

            cbx.DropDownStyle = ComboBoxStyle.DropDownList;

      }

      public bool PreFilterMessage(ref Message m)
      {
            if (m.Msg == 0x0100) // WM_KEYDOWN
            {
                if (_cbx.Focused || _cbx.DroppedDown)
                {
                  // Add your customized logic here.
                  return true;
                }
            }

            return false;
      }
    }
GcComboBoxCell和标准的ComboBox/ListBox的策略一样,仅匹配首字母。
如果你有匹配前序多个字符的需求,看样子只能通过MessageFilter过滤掉部分的KeyDown事件。

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

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

qiuzhilv007 发表于 2015-9-7 17:22:00

回复 7楼Leo的帖子

感谢回复。
这种方法比较危险。因Multirow被封装,其中有很多对按键的动作单独处理。比如重写了OnKeyDown
且在GcComboBox编辑状态时是走不到PreFilterMessage中的,和keydown事件一样,只能在非编辑状态下走进去。
编辑时用的EditingControlShowing。感觉Multirow不好操作。
比GrapeCity.Win.ElTabelle.Sheet变得很复杂。
这个自动匹配的功能不能被禁用吗?

Carl 发表于 2015-9-7 17:59:00

GcComboBox和.NET的标准ComboBox一样,实现的是首字匹配。在DropDown模式下按字母只会匹配Item中的第一个字母。所以按下010会匹配两次0.
这个功能没有公开的接口可以禁用。唯一的方式是截获GcComboBox的KeyDown事件不让他处理。
Leo给出的方案完全可行。不管是编辑状态还是非编辑状态,都可以走到PreFilterMessage。我们已经测试过。
如果你的PreFilterMessage在编辑状态走不到,我怀疑你的工程里对Windows Message有自己的处理,比如使用了Message Hook等底层技术。如果是这样,必须在你的代码里把Message派发正确才可以。

qiuzhilv007 发表于 2015-9-7 18:52:00

回复 9楼Carl的帖子

PreFilterMessage确实在编辑状态也走。
我在PreFilterMessage开始判断是否获得焦点写错了,非编辑时GcMultirow.Focused是True,编辑时是False。
非常感谢各位斑竹的帮助。:mj72:
页: [1] 2
查看完整版本: GcCombobox如何禁用其自动选择对应项目的功能