【问题标题】:Setting the Text property of a DropDownList ComboBox to an invalid value doesn't raise exception?将 DropDownList ComboBox 的 Text 属性设置为无效值不会引发异常?
【发布时间】:2012-07-12 10:21:09
【问题描述】:

我正在寻找解决 Winforms 应用程序问题的方法,该应用程序使用 ComboBox 控件。具体来说,ComboBox (Style=DropDownList) 绑定到数据源,并且当用户浏览其他一些数据时,设置了 ComboBox 属性的“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 属性设置器并检查该值是否在列表中”。事实证明,这并不像看起来那么简单。问题在于“文本”属性在各种场景中设置为各种事物。例如,它在分配 DataSource 属性时设置,或者在 SelectedIndex 设置为 -1 时设置。此外,它被设置为所选项目的字符串表示形式 - 因此,如果您碰巧有一个绑定到 KeyValue 对列表的 ComboBox 控件,您可以将“Text”属性设置为“[Key,Value]”之类的东西。如果它绑定到 DataTable/DataView,您将获得 DataRow 的字符串表示,这将变得更难检测。

此时我认为可能有另一种方法可以达到预期的结果(即检测 Text 属性的设置为某个无效值 - 什么都不做)。 p>

有什么想法吗?

【问题讨论】:

    标签: combobox


    【解决方案1】:

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

    /// <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));
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多