/// <summary>
/// このユーザーコントロールが選択可能かどうかを取得または設定します。
/// </summary>
public bool Selectable
{
get
{
return this.GetStyle(ControlStyles.Selectable);
}
set
{
if (this.GetStyle(ControlStyles.Selectable) != value)
{
this.SetStyle(ControlStyles.Selectable, value);
this.OnSelectableChanged(EventArgs.Empty);
}
}
}
// ユーザーコントロールのSelectable・Visibleが変更した時のイベントに
// ユーザーコントロール上の各コントロールが活性かどうかをチェックする処理を追加します。
userControl.SelectableChanged += new EventHandler(this.ChkActive);
userControl.VisibleChanged += new EventHandler(this.ChkActive);
2.チェック処理を実装します
/// <summary>
/// このユーザーコントロール上のコントロールがアクティブかどうかをチェックし、アクティブなコントロールが1つでもある場合、このユーザーコントロールも選択可能とする
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ChkActive(object sender, EventArgs e)
{
// 子のコントロールをチェックする
foreach (Control ctrl in this.Controls)
{
// アクティブなコントロールが1つでもあれば、ユーザーコントロールを選択可能とし処理を抜ける
if (this._ChkActive(ctrl))
{
this.Selectable = true;
return;
}
}
this.Selectable = false;
}
/// <summary>
/// チェック処理
/// </summary>
/// <param name="ctrl"></param>
/// <returns></returns>
private bool _ChkActive(Control ctrl)
{
bool visible = ctrl.Visible;
bool tabstop = ctrl.TabStop;
bool selectable = false;
// ユーザーコントロールの場合はSelectableを確認
if (ctrl is HekUserControl)
{
var u = (HekUserControl)ctrl;
selectable = u.Selectable;
}
// 他のコントロールはEnableを確認
else
{
selectable = ctrl.Enabled;
}
// アクティブな時
if (visible && tabstop && selectable)
{
return true;
}
// さらに子のコントロールがある時、かつユーザーコントロールでない時
if (ctrl.Controls.Count != 0 && !(ctrl is HekUserControl))
{
foreach (Control next in ctrl.Controls)
{
if (this._ChkActive(next))
{
return true;
}
}
}
return false;
}
3.ユーザーコントロール上の各コントロールのVisible・TabStop・Enable・Selectable(ユーザーコントロールのみ)のChangeイベントにチェック処理を追加します
// 追加する
usercontrol.AddChangeActiveEvent();
/// <summary>
/// ChkActive処理をイベントに追加する
/// </summary>
public void AddChangeActiveEvent()
{
foreach (Control ctrl in this.Controls)
{
this._AddChangeActiveEvent(ctrl);
}
}
/// <summary>
/// ChkActive処理をイベントに追加する
/// </summary>
/// <param name="ctrl"></param>
private void _AddChangeActiveEvent(Control ctrl)
{
// ユーザーコントロールはSelectableのみ
if (ctrl is HekUserControl)
{
var u = (HekUserControl)ctrl;
u.SelectableChanged += new EventHandler(this.ChkActive);
}
// ユーザーコントロール以外のコントロールの場合
else
{
ctrl.VisibleChanged += new EventHandler(this.ChkActive);
ctrl.TabStopChanged += new EventHandler(this.ChkActive);
ctrl.EnableChanged += new EventHandler(this.ChkActive);
// さらに子のコントロールがある時
if (ctrl.Controls.Count != 0)
{
foreach (Control next in ctrl.Controls)
{
this._AddChangeActiveEvent(next);
}
}
}
}
2018年7月31日火曜日 15時37分47秒 UTC+9 masatakashibuya: