さまざまな機能をいくつかのユーザー コントロールに分割した Windows フォーム アプリがあります。これらのユーザー コントロールのそれぞれに同意ボタンを設定したいと考えています。
ここにベストプラクティスはありますか?
私の考えは、フォーカスのあるユーザー コントロールを検出し、それを親フォームに設定することです。
他のアイデアはありますか?
さまざまな機能をいくつかのユーザー コントロールに分割した Windows フォーム アプリがあります。これらのユーザー コントロールのそれぞれに同意ボタンを設定したいと考えています。
ここにベストプラクティスはありますか?
私の考えは、フォーカスのあるユーザー コントロールを検出し、それを親フォームに設定することです。
他のアイデアはありますか?
通常、ベスト プラクティスは、フォームの動作が一貫するように、フォームの承認ボタンを 1 つだけにすることです。フォームのどのセクションにフォーカスがあるかによってリターンを押すと異なるアクションが発生すると、一般的にユーザーを混乱させます。ただし、特殊なアプリケーションを使用している場合、またはユーザーがこの機能を要求している場合は、提案されたソリューションが機能すると思います.
Jan Miksovsky は UI デザインに関する優れたブログを持っており、まさにこのことについて記事を書いています。
ほとんどの UI プラットフォームでは、デザイナーがダイアログ内のどのボタンを既定のボタンにするかを指定できます。つまり、ユーザーが Enter キーを押した場合に押されるボタンです。通常、既定のボタンは、ユーザーが次に押す可能性が最も高いボタンであり、多くの場合、ダイアログを閉じる [OK] のようなボタンです。非常にトラフィックの多いダイアログでは、デフォルトのボタンを動的に変更してキーストロークを節約し、ユーザーのタスクを高速化することを検討することができます。
彼が使用する例は、Microsoft Outlook の [名前の選択] ダイアログです。これは、何をしているかに応じてデフォルトのボタンを変更します。
これが古い投稿であることは知っていますが、私はそれを理解したと思います。
メイン フォームの各ユーザー コントロールで "Enter" イベントを使用して、ユーザーがユーザー コントロールに "入る" (フォーカスを合わせる) と、this.AcceptButton = myUserControlButton
. 各ユーザー コントロールで "Leave" イベントを使用して、受け入れボタンがある場合は、それをデフォルトに戻すこともできます。
各ユーザー ボタンは、個々のユーザー コントロールの独自のインスタンスであると思いますか?
その場合は、親フォームでボタン イベントをトラップできます。プロパティを介して個々のボタンを公開すると、それらの Click イベントに関連付けることができます。すべてのコントロールと同様に、name プロパティがあるため、すべてのボタン クリック イベントで呼び出される 1 つのメソッドを持つことができます。
以下に、部分的なサンプル コードを示します。それぞれ 1 つのボタンを持つ 2 つのユーザー コントロールがあります。UC1 のボタンの名前は「btn1」、UC2 の「btn2」です。公開されたプロパティを「ButtonOK」と呼びます
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
public Button ButtonOK
{
get { return btn1; }
}
}
public partial class UserControl2 : UserControl
{
public UserControl2()
{
InitializeComponent();
}
public Button ButtonOK
{
get { return btn2; }
}
}
親(「Form1」)には、ロード時に各ボタンのクリックイベントに関連付けられるメソッドがありますが、同じメソッドを呼び出します。メソッド内で、"Name" プロパティをテストします。
public Form1()
{
InitializeComponent();
}
void Form1_Load(object sender, EventArgs e)
{
RegisterButtonEvents();
}
void RegisterButtonEvents()
{
userControl11.ButtonOK.Click += new EventHandler(ButtonOK_Click);
userControl21.ButtonOK.Click += new EventHandler(ButtonOK_Click);
}
void ButtonOK_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
if (btn != null)
{
if (btn.Name == "btn1")
{
Console.WriteLine(" ButtonOK from UserControl1 was pushed. The tag is " + btn.Tag.ToString());
}
else if (btn.Name == "btn2")
{
Console.WriteLine(" ButtonOK from UserControl2 was pushed. The tag is " + btn.Tag.ToString());
}
}
}
コントロールの「タグ」プロパティを使用することもできます。このプロパティは、オブジェクトを参照できるため、非常に便利です。
示されているとおりに正確に行う必要はありませんが、任意の「親」フォームを使用して UserControls への参照を取得し、ボタンを公開してから、それらのボタン (または任意のそのための制御)。
(親フォームに加えて) ユーザー コントロールのクリック イベントにも結び付ける場合は、デリゲートのリストを列挙し、その後にコードを実行する順序に注意する必要があることに注意してください。イベントが開始されます。
それが役立つことを願っています。