将连字字符放入下拉框文本中

4
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我使用下拉框(ComboBox),其中 DropDownStyle 设置为 DropDown,这意味着我可以插入任何文本,独立于 ComboBox 的列表数据源。

我将数据源设置为:

comboBox.DataSource = new List<string> {"", "oe"};

如果我设置带有字形连结的文本:
comboBox.Text = "œ";

当ligature的标准化条目不存在于数据源中时,文本通常会设置为oe形式。

如何强制不对此文本进行标准化?


可以确认。添加组合框和按钮,然后点击按钮设置文本,就像您所做的那样,第一次会显示“oe”,第二次会显示“œ”,不确定为什么。不知何故,当组合框比较它们并从数据源中选择后者时,“œ”等于“oe”。 - Sinatr
1
@Sweeper,你能简单概括一下吗?我发现"oe".Equals("œ", StringComparison.InvariantCulture)返回true - Sinatr
1个回答

1
你可以使用SelectedText属性代替Text属性:
comboBox.Focus();
comboBox.SelectedText = "œ";

SelectedText 值设置,意味着向 ComboBox 的编辑控件发送 (SendMessage) 一个 EM_REPLACESEL 消息。这只是替换编辑控件中的文本:控件不会尝试将输入的文本与列表中的元素匹配。

您还可以通过设置 重置 Text 属性:

comboBox.Text = string.Empty;
comboBox.SelectedText = "œ";

在此情况下,设置ComboBox.Text属性会在有先前选择时引发TextChanged事件3次,而设置焦点(如果有的话选择退出文本)并替换选择,则仅引发一次事件,且仅在文本实际更改时才引发。这可能是一个相关的差异。
设置Text属性意味着调用SetWindowText,该函数发送WM_SETTEXT消息。这将触发模式匹配功能,该功能还会根据Unicode Standard 12.1.0 Case Folding Properties进行字符规范化以进行大小写匹配过程:

数据支持既需要简单大小写折叠(其中字符串长度不变),也允许完全大小写折叠(其中字符串长度可能增加)的实现。请注意,在可以支持它们的情况下,完全大小写折叠是优越的:例如,它们允许“MASSE”和“Maße”匹配。


我明白你为什么使用“Focus”方法。使用“SelectedText”的主要问题在于它不会覆盖“Text”属性,而只是追加值。我宁愿重置“Text”属性而不是使用“Focus”。 - gangus
我提供了那个方法是有原因的。当之前有选择时,设置 [ComboBox].Text = string.Empty 会触发 TextChanged 事件3次。而 [ComboBox].Focus(); 加上 [ComboBox].SelectedText = "something"; 只会在文本实际更改时触发一次。也许这不重要,也许很重要。但现在你可以说“我明白为什么你使用 'Focus' 方法了”。所以你已经测试了两种方法,现在你拥有了这些信息。我会将这个细节添加到答案中。 - Jimi
我发现了另一个问题。使用 SelectedText 会将 SelectedValueSelectedItem 设置为 null,而 Text 则不会。因此,您需要记住并恢复它们。 - gangus
不是的。当您以任何方式更改文本并且新文本与列表中的任何项都不匹配时,SelectedItem将为空。 - Jimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接