フォームの複数のタブにいくつか (今のところ 10 としましょう) DevExpress LookUpEdit コントロール (Windows の DropDown コントロールのようなもの) がある状況があります。これらの 10 のコントロールはすべて、同じデータ ソースを使用して情報を取得するという点で同じです。私がやろうとしているのは、10 個のコントロールのいずれかで値が変更された場合、他の 9 個のコントロールでも値を変更したいということです。変更したくないこのタイプのコントロールがフォームに他にもあるため、プロパティに文字列値を追加Tag
し、Tag プロパティを特定の文字列に設定して、このタイプのすべてのコントロールを検索するメソッドを用意しました。
TextChanged
最初は、他のすべてのコントロールのテキストを変更し、それを各コントロールのイベントに割り当てるジェネリック メソッドを作成できるのではないかと考えていましたが、1 つのコントロールの値を別のもの (本質的に、1 つのコントロールの値を変更すると、同じメソッドが呼び出され、残りの値を変更しようとするため)。
わかりにくい場合は申し訳ありませんが、ここに私がやろうとしていることに関するいくつかのコードがあります...今のところ、2つのコントロールしかないとしましょう...lookupWeight
そしてlookupBicycleWeight
. それぞれのTextChanged
イベントで、私はこれを持っています:
private void OnLookupWeight_TextChanged(object sender, EventArgs e)
{
OnLookupWeight_TextChanged<LookUpEdit>(sender, e);
}
これはこれを呼び出します:
private void OnLookupWeight_TextChanged<T>(object sender, EventArgs e)
{
var controls = GetAll(tabPageSpecifications, typeof(T));
foreach (var control in controls)
{
if (control.Tag != null)
if (control.Tag.ToString() == "Weight")
if(control.Name != (sender as LookUpEdit).Name)
(control as LookUpEdit).EditValue = (sender as LookUpEdit).Text;
}
}
GetAll
サブコントロールを含む、指定された Control のすべてのコントロールを返す単純なメソッドです。
/// <summary>
/// method to get all child & sub-child controls within a control by type
/// </summary>
/// <param name="control">the control we're searching in (use this for the form)</param>
/// <param name="type">The control type we're looking for (i.e; TextBox)</param>
/// <returns></returns>
public IEnumerable<Control> GetAll(Control control, Type type = null)
{
var controls = control.Controls.Cast<Control>();
//check the all value, if true then get all the controls
//otherwise get the controls of the specified type
if (type == null)
return controls.SelectMany(ctrl => GetAll(ctrl, type)).Concat(controls);
else
return controls.SelectMany(ctrl => GetAll(ctrl, type)).Concat(controls).Where(c => c.GetType() == type);
}
OnLookupWeight_TextChanged
型にキャストしたため、メソッドが完全に汎用的ではないことはわかっていLookupEdit
ますが、戻って変更する前に、この時点でこれを機能させようとしています。
ご覧のとおり、行if(control.Name != (sender as LookUpEdit).Name)
は がOnLookupWeight_TextChanged
再び起動され、基本的にそれ自体をキャンセルする場所です。
これを達成する方法についての助けや方向性は素晴らしいでしょう。