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 回复 1楼qiuzhilv007的帖子
谢谢反馈。
从你的描述来看,我们不能模拟重现问题。
请提供一个重现问题的Demo,我们帮你看看。 谢谢回复。
因对Multirow进行了封装,所以比较难提供。
我描述的现象可以忽略,只想知道如何禁用在输入ID时GcCombobox自动去找对应项目的功能。 你可以尝试设置GcComboBoxCell.AutoCompleteMode = None, AutoCompleteSource = None, AutoSelect = false. 回复 4楼dafo的帖子
这三个设置是默认设置,没有改变。现在就是这样设置的
:? 回复 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
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了。 回复 7楼Leo的帖子
感谢回复。
这种方法比较危险。因Multirow被封装,其中有很多对按键的动作单独处理。比如重写了OnKeyDown
且在GcComboBox编辑状态时是走不到PreFilterMessage中的,和keydown事件一样,只能在非编辑状态下走进去。
编辑时用的EditingControlShowing。感觉Multirow不好操作。
比GrapeCity.Win.ElTabelle.Sheet变得很复杂。
这个自动匹配的功能不能被禁用吗? GcComboBox和.NET的标准ComboBox一样,实现的是首字匹配。在DropDown模式下按字母只会匹配Item中的第一个字母。所以按下010会匹配两次0.
这个功能没有公开的接口可以禁用。唯一的方式是截获GcComboBox的KeyDown事件不让他处理。
Leo给出的方案完全可行。不管是编辑状态还是非编辑状态,都可以走到PreFilterMessage。我们已经测试过。
如果你的PreFilterMessage在编辑状态走不到,我怀疑你的工程里对Windows Message有自己的处理,比如使用了Message Hook等底层技术。如果是这样,必须在你的代码里把Message派发正确才可以。 回复 9楼Carl的帖子
PreFilterMessage确实在编辑状态也走。
我在PreFilterMessage开始判断是否获得焦点写错了,非编辑时GcMultirow.Focused是True,编辑时是False。
非常感谢各位斑竹的帮助。:mj72:
页:
[1]
2