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)