免责声明 - 我现在只使用C#约一个星期,所以希望这不是一个n00b问题。我确实环顾四周,但无法找到有效的解决方案,包括来自this线程的结果。
我在Windows窗体上有一个组合框。组合框的数据从Access数据库填充。我设置的相关属性是 - AutoCompleteMode = Append; AutoCompleteSource = ListItems; DropDownStyle = DropDown。用户必须能够输入组合框并自动完成,因此DropDownList的DropDownStyle将无法工作。我没有使用默认下拉箭头,而是使用动态PictureBox替换它。单击PictureBox或触发Enter事件会将组合框的DropDowned属性设置为true。
目前,用户可以选择正常的项目或输入项目,然后按Enter键或输入项目并离开该字段等....在所有这些不同类型的交互过程中,我能够确定组合框中的正确值是。我有一些触发器来确保SelectedValue和显示的Text始终保持同步。
我能够在每一个可能的互动中获得正确的价值,我能想到的,除了一个。如果用户开始键入一个字符串(DropDowned属性= true)并点击右箭头键使字符串自动完成,则组合框中的字符串始终为空字符串。
视觉:
Selected_ 文字
上面字符串中的粗体文本是组合框中突出显示的文本。如果用户然后按右箭头键使组合框中的文本看起来像
Selected_Text
(注意此时DropDowned仍为true)ComboBox.Text值始终为“”。
以下是其中一个ComboBox的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始终为空字符串。如果DropDowned属性= false,则不是这种情况。发生这种情况时,会返回正确的字符串。
我甚至试过让程序选择comobox中的所有文本;但是,为SelectionLength赋予一个大于ComboBox.Text.Length的值似乎不起作用。我也尝试过引用SelectedValue;但是,SelectedValue为空。
对于所有密集目的,应用程序确信组合框中存在空字符串。
如何检索实际字符串?
如果这有助于我获得以下事件的代码:Click,DataSourceChanged,DropDown,DropDownClosed,Enter,KeyDown,Leave和Validated。
答案 0 :(得分:1)
我知道这与你的情况不一样。检查变通方法选项卡,看看那里发布的代码是否可以帮助您解决问题。这可能只是使用正确的事件。
我对某些Windows窗体控件的事件订单和所选属性的体验不太理想。
答案 1 :(得分:0)
我能够为这个明显的错误创建一个成功的解决方法。以下是我的解决方法;希望这段代码可以帮助别人。注意:您可能需要添加其他事件处理程序来微调所有ComoBoxes的用户交互,但这将适用于我在问题中描述的问题。
要使用此代码,您需要在表单上使用名为cmbxTest的ComboBox。您还需要添加适当的事件处理程序。假设您的表单名称为frmMain,如下所示,在fmrMain.Designer.cs文件中,添加此代码(请注意您还需要其他项目,但这些是需要添加的 new 项目到了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);
}
}