ComboBox.Text =空字符串,而不是实际显示的字符串

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

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

就目前而言,用户可以选择项目或者输入项目,然后按回车键或输入项目并离开字段等。在所有这些不同类型的交互过程中,我可以确定哪些项目的正确值组合框是。 我有一些触发器来确保SelectedValue和显示的文本始终保持同步。

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

视觉:

Selected_ Text

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

Selected_Text

(请注意,DropDowned在这一点上仍然是true)ComboBox.Text值始终为“”。

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

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;
        }
    }

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

我甚至尝试让程序选择组合框中的所有文本; 然而,给SelectionLength的值大于ComboBox.Text.Length似乎不起作用。 我也尝试过提及SelectedValue; 但是,SelectedValue为null。

对于所有密集目的,应用程序确信组合框中存在空字符串。

我如何检索实际的字符串?


如果这有助于我有以下事件的代码:单击,DataSourceChanged,DropDown,DropDownClosed,Enter,KeyDown,Leave和Validated。


这可能是一个错误:在按Tab键离开打开的下拉列表时,ComboBox的DropDownClosed事件处理程序中的SelectedItem错误

我知道这与你的情况不一样。 检查变通办法标签,看看那里发布的代码是否可以帮助你。 这可能只是使用正确事件的问题。

我对事件订单和某些Windows窗体控件的选定属性的体验一直不太理想。


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

要使用此代码,您需要在窗体上名为cmbxTest的组合框。 您还需要添加适当的事件处理程序。 假设您的表单名称是frmMain,如下所示,请在fmrMain.Designer.cs文件中添加此代码(请注意,您还需要其他项目,但这些是需要添加到ComboBox的新项目,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);
    }
}
链接地址: http://www.djcxy.com/p/60901.html

上一篇: ComboBox.Text = null string instead of actual displayed string

下一篇: SuggestAppend Combobox shows doesnt show duplicate names (if exists)