【问题标题】:C#: Setting ComboBox text value in SelectedIndexChange event handler?C#:在 SelectedIndexChange 事件处理程序中设置 ComboBox 文本值?
【发布时间】:2011-02-24 19:51:47
【问题描述】:

我有一个包含下拉组合框的 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");
}

【问题讨论】:

  • 可以分享 selectedindexchanged 事件中的代码吗?如果我对您的理解正确,您需要将组合框的 DropDownStyle 属性更改为 DropDown,这应该会给您想要在组合框中显示的字符串。
  • 原始帖子已编辑以显示代码
  • 您是否尝试过更改 ListItem 本身的文本,而不是 ComboBox.SelectedText 属性?
  • 我不想更改列表项的文本,因为我总是希望下拉菜单中提供相同的选项。更改所选项目的列表项将有效地删除该选项并将其替换为日期。

标签: c# winforms combobox


【解决方案1】:

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

但是,如果您尝试获取 SelectedText 中的值 SelectedIndexChangedSelectedValueChanged 事件处理程序, 该属性返回一个空字符串。 这是因为,在这些时候 事件,以前的SelectedText 值已被清除,新的 值尚未设置。到 检索 a 中的当前值 SelectedIndexChangedSelectedValueChanged 事件处理程序, 请改用SelectedItem 属性。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2012-07-22
    相关资源
    最近更新 更多