{A}
{S0}
版本1.3 - 检索与固定宽度/隐藏列。支持从右至左语言。简介
的用户,我写有填写表格,包括许多代码从组合框选择的方案。这些代码是固定的。普通用户不能进入新的代码,但必须选择一个预定的值列表。做数据录入的人都非常熟悉的代码和键盘中心。他们不想使用鼠标每次输入一个值。查看数据,但不这样做大量的数据录入"的人不熟悉的代码,但要看到更详细的文字描述每个代码是与。
的解决方案,我试图创建一个多组合框,链接到一个只读的TextBox。当用户从ComboBox中选择一个项目,它会同时显示的代码在一个多下拉列表和描述。但是,当ComboBox的封闭,我想显示在文本框链接到它的ComboBox中的代码和描述。在ComboBox的代码将绑定到数据库,并在TextBox将未绑定的,仅供参考之用。通过这种方式,用户都将能够看到的信息是最重要的是他们。
我也想强制用户只能选择在ComboBox列表的项目。用户无法输入任何文字,是不是有效。因此,这种控制可以工作在两种模式之一:自动完成=真。当"自动完成"设置为true,控制的行为像一个ComboBoxStyle.DropDown。用户可以键入一个值,它会自动完成对基于关联的值列表。如果用户键入一个字母,将导致一个无效的代码输入,击键抑制。自动完成=假。当"自动完成"设置为false,控制的行为就像一个ComboBoxStyle.DropDownList(即使它实际上有一个ComboBoxStyle.DropDown的视觉风格)。在这种模式下,用户可以打一个字母或数字控制,将通过该列表中的值,字母或数字开头的所有周期。但封闭组合框不会显示像一个ListBox中的列之间的分界线。它只是显示的代码值,无论ComboBox是多么广泛。背景
这篇文章和我创建的控制不会有可能如果没有工作,他写道:控制。这是他的工作,帮助我克服一切艰难的障碍,阻止我创造我所需要的。有一次,我发现他的代码,我是能够创造出一个解决方案,在大约一天。如果您喜欢这个控制,并发现它有用,首先感谢他(和最)。而不是重复他所有的文档在这里,我建议你读他的网页上的控制,如果你想更好地了解了我的控制是如何工作的。
我想也想感谢,因为我用我的自动完成功能的基础上他的论坛的建议。使用代码
若要使用此代码,所有你所要做的的是从工具箱选择一个TextBox一起MultiColumnComboBox和形式。
然后,您可以设置以下属性:"自动完成"功能:真正使得它像一个下拉自动完成。假使得它像一个只读DropDownList的行为。AutoDropdown:当你按一个键,它会自动下拉列表,所以你可以看到选择。在"自动完成"=真正的模式,它会自动关闭,当你输入一个有效的选择。BackColorEven:列表中甚至项目的背景色。默认是白色的。BackColorOdd:背部颜色列表中的多项。默认是白色的。我总是用一个黑色的前景色,所以我没有码的奇数/偶数ForeColor属性。LinkedColumnIndex:什么是您想要显示的TextBox列的索引?我的大部分形式ComboBox中显示0列和TextBox中显示列1。LinkedTextBox:从窗体上的控件的下拉列表中选择一个文本框。当一个TextBox到ComboBox,它会自动设置为ReadOnly = true和在设计时的TabStop =假。
击中Escape键清除ComboBox和其相关联的TextBox。版本1.1的变化
,一旦我开始使用的控制,并成为多了几分熟悉编写代码Nishant,我意识到有一个,我想才能有它的行为方式,我需要它来的一些变化。所以,我调整了一点:Delete键清除Esc键以同样的方式在原来的版本中没有的控制和链接的文本框。Backspace键的行为像一个左箭头键。它不会从代码中删除的信件,因为我想执行唯一有效的选择。它只是将插入符返回一个空间和位置的清单。原来的版本要在下拉列表中的每一个项目,遍历和动态设置列的宽度。由于另一名成员在反馈中指出,这是一个问题时,与许多公共属性的对象,因为它们都显示在列表中。我决定把用户指定的项目,以便列可以通过值设置为0隐藏的列宽。我添加了一个例子,演示,展示了一种以编程方式引用一个隐藏的列选定ComboBox项,如果有人想隐藏一列,但使用类似ID或键值。
添加这些功能增加了两个属性:ColumnWidthDefault:如果列的宽度是没有明确宣布,这将是该列的宽度。列宽:一个分隔的字符串列的宽度。要实现此功能,我复制一个Microsoft Access中使用分号分隔的字符串指定的列宽的成语。一个空白列设置为默认。
这里有几个例子:ColumnWidthDefault = 75
ColumnWidths =
结果:每列将显示默认宽度为75。
绑定到六列的对象:{C}
结果:Column0 = 100,此行中column1 = 75(默认),Column2的= 200;其余三个所有列默认为75。
绑定到一个对象有三列:ColumnWidthDefault = 75
ColumnWidths = 0;50;150
结果:Column0与宽度为零,将Column1 = 50,Column2的= 150隐藏。
绑定到六列的对象:ColumnWidthDefault = 0
ColumnWidths = 50;100
结果:Column0 = 50,此行中column1 = 100,其余全部是隐藏的,因为他们是默认值为零。版本1.2的变化
将控件绑定到一个数组的对象,有大量的属性造成的问题。虽然数据集的定义它们的顺序,与很多公共属性的对象将显示在其列将显示在下拉列表中以随机顺序的属性。这使得它无法使用列索引来设置列的宽度,因为没有保证,一列将始终被捆绑到一个特定的指数。
为了解决这个问题,我添加了一个新的属性,使程序员可以定义列将显示名称和它们将出现。的ColumnName:列名的分隔的字符串。名的顺序决定了列的顺序。一个空字符串显示所有的列。看起来像这样一个例子:ProductCode;ProductCategory;ProductDescription
几个在我的程序的下拉列表中有很多的代码(数百个)。在大部分时间内,用户可以选择一些很常见的选择,很容易记住。但是,当一个新的用户学习系统,或有经验的用户需要找到一个很少使用的项目,一些搜索工具可以有所帮助。
由于这个原因,我添加了一个OpenSearchForm事件类。当用户点击LT; F3gt;键(标准的Windows搜索键),这个事件被解雇。程序员可以创建任何他喜欢的那种搜索表单,并把此事件。我增加了一个搜索表单示例演示,用户可以在其中输入一个搜索词,按下回车键,将在位于搜索网格和字符串。双点击网格中的一个项目,设置在ComboBox中的价值和关闭窗体。为了测试这一点,用户应该去一个ComboBox列出了所有的国家,打LT; F3gt;,键入字quot; Northquot;,并打回车键几次看到它通过国家循环它找到。
要打开搜索表单在我的演示程序,我添加了一个单一的程序:private void multiColumnComboBox_OpenSearchForm(object sender, EventArgs e)
{
FormSearch newForm = new FormSearch((MultiColumnComboBox)sender);
newForm.ShowDialog();
}
然后,我这单一事件的形式,每个ComboBox OpenSearchForm事件链接。搜索表单,然后是打开设置DataSource的搜索表单的DataGridView的DataSource通过组合框。我用的是ColumnNameCollection和传递ComboBox来确定哪些列显示在网格ColumnWidthCollection。
此搜索日常工作为我所有的例子,但之一。如果一个ComboBox的数据源是一个数组对象暴露了很多物业,下拉列表看起来很好的,如果我使用的语句columnNames属性只显示我想看到的属性:
{S2}
但是,如果我打LT; F3gt;键打开搜索列表,该列表将失去其订购:
{S3}
,而不是显示Property0,Property1,Property2,它会显示在底层数组的随机顺序列。甚至当我硬编码的位置,它仍然会忽略这些设置在这一个实例。搜索和双击工作得很好,只是列的顺序,我想他们不会。小对象和数据集,像他们应该工作。
我是唯一的办法能够解决这个的,有大类实现只暴露接口的属性,应该会出现在ComboBox://An interface that only shows properties 0, 1 & 2
public interface ICombo012
{
string Property0
{
get;
}
string Property1
{
get;
}
string Property2
{
get;
}
}
// A class that has 10 properties but can display
// properties 0, 1 & 2 or properties 1 & 9
// through two different interfaces
public class ComplexObject : ICombo012, ICombo19
{
//Class with 10 properties defined here
}
将ComboBox绑定到更小的接口,允许我使用较大的物体,没有问题的。我不知道这是否是最好的方式来解决这个问题,但因为这是一个学习的过程对我来说,我相信会有人指出,一个更优雅的解决方案,如果有一个可用。即使它的希望,我将最终能够提炼成一个有用和可靠的控制,将一些问题,我的目标是后每一套改善。版本1.3的变化
我添加为从右至左语言的支持。如果语言是LeftToRight,我在OnDrawItem事件中绘制字符串,零列开始和结束的最后一列,使用默认设置。如果是从右至左的语言,我提请以相反的顺序列,从最高的指数下降到零。我还可以使用StringFormat对象在从右至左的风格保持一致的字符串。
此更新还暴露了一个小quot; flawquot;在早期版本。当设置在OnDropDown事件的DropDownWidth,我没有计算垂直滚动条的宽度,如果它是目前。在LeftToRight的语言,这将截断尾随的最后一列中的字符,并可以quot; fixedquot;通过更广泛的最后一列。
,但从右至左语言,垂直滚动条的存在将晦涩的第一列(最右边)的显著特征。只有这样,才能解决这个问题,以确保垂直滚动条的宽度也增加了,每当Items.Count是比MaxDropDownItems。版本1.3.1变化
,我收到了在荷兰从ONNO Sloof电子邮件表明,添加以下行:protected override void OnSelectedValueChanged(EventArgs e)
{
base.OnSelectedValueChanged(e);
.
.
.
}
的OnSelectedValueChanged事件,将有助于与绑定。按照他的建议,我此行到1.3.1版本。历史1月31日,2008 - 1.3.1版本出版。2007年12月26日 - 版本1.3发布。2007年8月24日 - 版本1.2发布。2007年8月22日 - 版本1.1发布。2007年8月14日 - 文章首次发表。