0

免责声明 - 我现在只使用 C# 大约一个星期,所以希望这不是一个 n00b 问题。我确实环顾四周,但找不到有效的解决方案,包括线程的结果。

我在 Windows 窗体上有一个组合框。组合框的数据是从 Access 数据库中填充的。我设置的相关属性是 - AutoCompleteMode = Append; AutoCompleteSource = ListItems; 下拉样式 = 下拉。用户必须能够输入组合框并自动完成,因此 DropDownList 的 DropDownStyle 将不起作用。我没有使用默认的下拉箭头,而是使用动态 PictureBox 替换它。单击 PictureBox 或触发 Enter 事件会将组合框的 DropDown 属性设置为 true。

就目前而言,用户可以很好地选择项目或输入项目并按回车键或输入项目并离开该字段等......在所有这些不同类型的交互中,我能够确定正确的值在组合框是。我有某些触发器来确保 SelectedValue 和显示的 Text 始终保持同步。

我能够在我能想到的每一种可能的交互下获得正确的值,除了一个。如果用户开始键入字符串(使用 DropDown 属性 = true)并按右箭头键以使字符串自动完成,则组合框中的字符串始终为空字符串。

视觉的:

已选_文字

上述字符串中的粗体文本是组合框中突出显示的文本。如果用户然后点击右箭头键使组合框中的文本看起来像

Selected_Text

(请注意,此时 DropDown 仍然为真) ComboBox.Text 值始终为“”。

这是 ComboBoxes 的 DropDownClosed 事件之一的代码,这是用户按下回车后触发的第一件事。

private void cmbxYear_DropDownClosed(object sender, EventArgs e)
    {
        try
        {
            if (!cmbxYear.Text.Equals(cmbxYear.SelectedValue.ToString()))
            {
                if (!bUpdated & !bErrorFound)
                {
                    validateData(cmbxYear, clrYear, false, imgFilter1, imgNoFilter1);
                    updateTable();
                }
            }
            imgFilter1.Visible = false;
            imgNoFilter1.Visible = true;
        }
        catch
        {
            imgNoFilter1.Visible = false;
            imgFilter1.Visible = true;
        }
    }

我还刚刚发现,当 DropDown 属性 = true 并且用户输入了某些内容然后按“Enter”时,ComboBox.Text 始终为空字符串。如果 DropDown 属性 = false,则不是这种情况。发生这种情况时,将返回正确的字符串。

我什至尝试让程序选择组合框中的所有文本;但是,为 SelectionLength 提供一个大于 ComboBox.Text.Length 的值似乎不起作用。我也尝试过引用 SelectedValue;但是,SelectedValue 为空。

出于所有密集目的,应用程序确信组合框中有一个空字符串。

如何检索实际的字符串?


如果这有助于我为以下事件编写代码:Click、DataSourceChanged、DropDown、DropDownClosed、Enter、KeyDown、Leave 和 Validated。

4

2 回答 2

1

这可能是一个错误:Wrong SelectedItem in DropDownClosed event handler of ComboBox when press Tab to leave an open dropdown

我知道这和你的情况不一样。检查解决方法选项卡,看看那里发布的代码是否对您有帮助。这可能只是使用正确事件的问题。

我对某些 Windows 窗体控件的事件顺序和选定属性的体验不太理想。

于 2012-08-09T16:51:29.907 回答
0

我能够为这个明显的错误创建一个成功的解决方法。以下是我的解决方法;希望此代码对其他人有所帮助。注意:您可能需要添加其他事件处理程序来微调所有 ComoBoxes 的用户交互,但这将适用于我在问题中描述的问题。

要使用此代码,您将需要一个名为 cmbxTest 的表单上的 ComboBox。您还需要添加适当的事件处理程序。假设您的表单名称是 frmMain,如下所示,在 fmrMain.Designer.cs 文件中,添加此代码(注意您也需要其他项目,但这些是需要添加到组合框 cmbxTest的项目,即应该已经在您的测试表格上,frmMain):

this.cmbxTest.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append;
this.cmbxTest.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.cmbxTest.DropDownClosed += new System.EventHandler(this.cmbxTest_DropDownClosed);
this.cmbxTest.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ComboBoxKeyUp);
this.cmbxTest.Text = "Test";  // Used in the below example - The default displayed text

在表单的类文件(本例中为 frmMain.cs)中,使其如下所示:

public partial class frmMain : Form
{
    // Intial Declerations and initializations
    Boolean bReady = false;       // Secondary trigger for DataGridView selection
    string clrTest = "Test";      // Default display text - Clear filter text; Used to ignore the setting if this text is visible
    string currentText;           // Comboboxes' currently displayed text

    // Form execution
    public frmMain()
    {
        InitializeComponent();
    }

    // Some code...

    //
    // ComboBoxes on KeyPress event
    //      - Used as a workaround for MS ComboBoxes not updating their text correctly
    //      - Shared across all ComboBoxes (as applied by the individual controls' event handlers)
    //
    private void ComboBoxKeyUp(object sender, KeyEventArgs e)
    {
        ComboBox cmb = (ComboBox)sender;
        currentText = cmb.Text;
    }

    // Any trigger you want that requires the ComboBoxes text
    private void cmbxTest_DropDownClosed(object sender, EventArgs e)
    {
        if (!cmbxTest.Text.Equals(clrTest))
        {
            cmbxTest.Text = currentText;
        }
        // Do any other code that requires the cmbxTest.Text
        Console.WriteLine(cmbxTest.Text);
    }
}
于 2012-08-09T19:04:15.440 回答