将DropDownList ComboBox的Text属性设置为无效值不会引发异常?

时间:2012-07-12 10:21:10

标签: combobox

我正在寻找解决Winforms应用程序问题的方法,该应用程序使用ComboBox控件。具体来说,ComboBox (Style = DropDownList)绑定到数据源,当用户浏览其他一些数据时,ComboBox属性的“Text”属性被设置 - 用户可以选择一些其他价值。

当我将“Text”属性设置为的值不在可用项列表中时,麻烦就开始了。似乎没有任何反应。采用以下简单示例:

public partial class Form1 : Form
{
  public Form1()
  {
      InitializeComponent();

      myComboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
      //myComboBox1.Items.AddRange(new[] { "One", "Two", "Three" });

      List<KeyValuePair<Int32, String>> values = new List<KeyValuePair<Int32, String>>();
      values.Add(new KeyValuePair<Int32, String>(1, "One"));
      values.Add(new KeyValuePair<Int32, String>(2, "Two"));
      values.Add(new KeyValuePair<Int32, String>(3, "Three"));

      myComboBox1.DataSource = values;
      myComboBox1.ValueMember = "Key";
      myComboBox1.DisplayMember = "Value";

      button1.Click += (s, e) => { myComboBox1.Text = "Four"; };
      button2.Click += (s, e) => { myComboBox1.SelectedIndex -= 1; };
   }
}

public class MyComboBox : System.Windows.Forms.ComboBox
{
   public override string Text
   {
      get { return base.Text; }
      set { MessageBox.Show(value); base.Text = value; }
   }
}

这种技术在整个大型应用程序中使用,所以当注意到(在上面的示例中)将“Text”设置为“Four”时什么也没做,我想也许我可以陷阱这个并抛出异常。实际上,该应用程序充满了这样的代码:

if (myDataRow.IsBlahNull())
    myComboBox1.Text = "";
else
    myComboBox1.Text = myDataRow.Blah;

现在,虽然我理解设置“SelectedIndex = -1”对于“IsNull”情况会更好,但事实仍然是myDataRow.Blah可能不是有效值。此外,应用程序写为(和实时),因此更少的更改越好。

所以,我的直接想法是“让我们覆盖Text属性设置器并检查该值是否在列表中”。事实证明,这看起来并不像看起来那么简单。问题是“Text”属性在各种场景中都设置为各种各样的东西。例如,它在分配DataSource属性时设置,或者在SelectedIndex设置为-1时设置。此外,它设置为所选项的字符串表示形式 - 因此,如果您碰巧有一个ComboBox控件绑定到KeyValue对列表,您将“Text”属性设置为“[Key,Value]”。如果它绑定到DataTable / DataView,您将获得DataRow的字符串表示,并且更难以检测。

在这一点上,我认为可能有另一种方法来实现所需的结果(这是为了检测Text属性的设置为某个无效值 - 它什么都不做)

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

经过反思,这是一个合理的解决方法吗?

/// <summary>
/// Gets or sets the text associated with this control.
/// </summary>
public override string Text
{
   get { return base.Text; }
   set
   {
      base.Text = value;

      if ((value != null) && (base.Text != value))
         if (value == "")
            this.SelectedIndex = -1;
         else
            throw new ArgumentException(String.Format("Cannot set Text property of {0} to \"{1}\".", this.Name, value));
   }
}