C#:在SelectedIndexChanged事件处理程序中设置ComboBox文本值?

时间:2011-02-24 19:51:47

标签: c# winforms combobox

我有一个包含DropDown组合框的winform,用户可以在其中输入购买日期。

组合框中的项目是“选择日期”,它会显示一个日历,以便用户可以选择日期,“今天”和“上周”。如果用户选择“今天”或“上周”,我想将下拉控件的文本值设置为该日期字符串。我试图在SelectedIndexChanged处理程序中执行此操作,但没有骰子。 DropDown列表只显示一个空白字段。

有什么想法吗?

private void comboBoxPurchased_SelectedIndexChanged(object sender, EventArgs e)
{
    Types.ComboInfo info = (Types.ComboInfo)comboBoxPurchased.SelectedItem;

    DateTime newDate = stock.PurchaseDate;
    switch ((Types.PurchasedDate)info.id)
    {
      case Types.PurchasedDate.PickCustom:
        //popup a date dialog and let the user choose the date
        PopupCalendar p = new PopupCalendar();
        if (p.ShowDialog() == DialogResult.OK)
          // show date in combobox
          newDate = p.Date;
        break;

      case Types.PurchasedDate.Today:
        newDate = DateTime.Now;
        break;

      case Types.PurchasedDate.WithinLastWeek:
        newDate = DateTime.Now.AddDays(-7);
        break;

      case Types.PurchasedDate.WithinLastMonth:
        newDate = DateTime.Now.AddMonths(-1);
        break;
    }

    // re-create combobox items with new purchase date
    //PopulatePurchaseDateCombo(newDate);
    comboBoxPurchased.SelectedText = date.ToString("MMMM d, yyyy");
    comboBoxPurchased.Text = date.ToString("MMMM d, yyyy");
}

1 个答案:

答案 0 :(得分:4)

在ComboBox的可编辑部分中选择的SelectedText属性文本。 MSDN states

  

然而,如果你试图得到   SelectedText中的SelectedIndexChanged值   SelectedValueChanged或   SelectedText事件处理程序,   该属性返回一个空字符串。   这是因为,在这些时候   事件,前一个SelectedIndexChanged   价值已被清除,新的   价值尚未确定。至   检索a中的当前值   SelectedValueChanged或   SelectedItem事件处理程序,   请改用SelectedText属性。

由于SelectedItem属性与BeginInvoke属性紧密相关,因此更改所选文本可能会导致所选索引发生更改。正如您所观察到的,这可能导致重新入侵问题,这些问题可能会阻止一个或两个操作成功完成。在这种情况下,诀窍是延迟更新,直到当前事件完成。在WinForms中,这可以使用Dispatcher方法和将执行延迟工作的适当委托来完成(在WPF应用程序中,这是使用当前控件的{{1}}执行的。)

您可能需要考虑使用与此任务的组合下拉菜单不同的控件,因为您的用例并不真正符合从列表中选择的想法。听起来你真正需要的是更像菜单和文本显示。