0

ComboBoxコントロールを使用するWinformsアプリケーションの問題を解決する方法を検討しています。具体的には、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; }
   }
}

この手法は大規模なアプリケーション全体で使用されているため、 (上記の例で) 「テキスト」を「4」に設定しても何も起こらないことに気付いたとき、これをトラップして例外をスローできるのではないかと思いました。実際には、アプリケーションには次のようなコードが含まれています。

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

ここで、「IsNull」の場合は「SelectedIndex = -1」を設定する方がよいと思いますが、myDataRow.Blahが有効な値ではない可能性があるという事実は変わりません。また、アプリケーションは作成されている(そしてライブである)ので、変更が少ないほど良いです。

ですから、私がすぐに考えたのは、「Textプロパティセッターをオーバーライドして、値がリストにあることを確認しましょう」ということでした。結局のところ、見た目ほど単純なものではありません。問題は、「Text」プロパティがあらゆる種類のシナリオであらゆる種類のものに設定されていることです。たとえば、DataSourceプロパティが割り当てられたとき、またはSelectedIndexが-1に設定されたときに設定されます。また、選択したアイテムの文字列表現に設定されているため、KeyValueペアのリストにバインドされたComboBoxコントロールがある場合は、「Text」プロパティを「[Key、Value]」のように設定します。DataTable / DataViewにバインドされている場合は、DataRowの文字列表現を取得するため、検出がさらに困難になります。

この時点で、目的の結果を達成する別の方法があるかもしれないと思いました(Textプロパティの無効な値への設定を検出することです-これは何もしません)

何か案は ?

4

1 に答える 1

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));
   }
}
于 2012-07-12T10:46:08.273 に答える