2011-02-24 87 views
1

我有一个包含DropDown组合框的winform,用户可以在其中输入购买日期。C#:在SelectedIndexChange事件处理程序中设置ComboBox文本值?

组合框中的项目是'选择日期',它会显示一个日历,以便用户可以选择一个日期'今天'和'上周'。如果用户选择“今天”或“上周”,我想将下拉控件的文本值设置为该日期字符串。我试图在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"); 
} 
+0

你能分享selectedindexchanged事件中的代码吗?如果我正确理解你,你需要将组合框的DropDownStyle属性更改为DropDown,并且应该给你想要在组合框中显示的字符串。 – reggie 2011-02-24 19:56:38

+0

原始文章编辑显示代码 – Curtis 2011-02-24 20:02:10

+0

您是否尝试过更改ListItem本身的文本,而不是ComboBox.SelectedText属性? – 2011-02-24 20:09:36

回答

4

了在组合框的可编辑部分选择的SelectedText属性文本。 MSDN states

但是,如果你尝试在 SelectedIndexChangedSelectedValueChanged事件处理程序来获取 SelectedText值, 属性返回一个空字符串。 这是因为在这些 事件发生时,之前的SelectedText 值已被清除,并且新的 值尚未设置。到 检索当前值 SelectedIndexChangedSelectedValueChanged事件处理程序, 改为使用SelectedItem属性。

由于SelectedText属性紧密相关SelectedItem财产,改变选择的文本会导致所选择的指数的变化。正如你所观察到的,这可能会导致再次入侵问题,从而阻止一个或两个操作成功完成。在这种情况下,诀窍是延迟更新,直到当前事件完成。在WinForms中,可以使用BeginInvoke方法和一个合适的委托来完成延期工作(在WPF应用程序中,这是使用当前控件的Dispatcher执行的)。

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

+0

谢谢。 BeginInvoke做到了! – Curtis 2011-02-24 20:46:44

+0

@Curtis:很高兴帮助! – 2011-02-24 21:39:52