1

私の現在のプロジェクトでは、私は自分のに可変量を追加していusercontrols : ucTaskますflowlayoutpanel : flpTasks

foreach (task t in tasks)
{
   ucTask uct = new ucTask();
   uct.id = t.task_id;
   uct.date= t.date.ToString();
   uct.btnNaam = t.task_id.ToString();

   uct.OnButtonclick += new EventHandler(uct_OnButtonclick);

   flpTasks.Controls.Add(uct);
}

ucTask

これで、これらのユーザーコントロールがflowlayoutpanelにいくつか表示され、そのボタンを押したときにイベントを発生させたいと思います。Iを使用EventHandlerするとイベントを発生させることができますが、別のボタンに対して別のイベントを発生させる必要があります。

    void uco_OnButtonclick(object sender, EventArgs e)
    {
        lblStatus.Text = "TEST";
    }

どのボタン(またはユーザーコントロール)を押したかを知る方法がわかりません。そして、私はアイデアがありません、何か提案はありますか?

ありがとう、トーマス

4

2 に答える 2

2

イベントの送信者は、実際にはボタンの1つです。送信者をボタンタイプにキャストすると、任意のボタンプロパティにアクセスして、押されたボタンを判別できます。

void uco_OnButtonclick(object sender, EventArgs e)
{
   Button button = sender as Button;
   if (button == null)
       return;

   lblStatus.Text = button.Name;
}

更新:質問をもう一度読んだ後、ucTaskは実際にはUserControlであることがわかりました。これは、内部のボタンがクリックされたときにイベントを発生させます。

それで、最初はネーミングです。C#のクラス名に適したスタイルはPascalCaseです。たとえば、タスクユーザーコントロールの適切な名前はになりますTaskControl。次はイベントの命名です。イベントに。という名前を付けるのが一般的EventName(-ing, -ed)です。イベントを発生させたい場合は、適切なスタイルは保護されたメソッドOnEventName(-int, -ed)です。また、ユーザーコントロールを作成するときは、ビジネス用語を使用してイベントに名前を付けることができます。例:TaskCreated、TaskChanged。また、カスタムEventArgsを作成して、任意のパラメーターをイベントに渡すこともできます。

したがって、ユーザーコントロールの場合:

public class TaskChangedEventArgs : EventArgs
{
    public TaskChangedEventArgs(int taskId)
    {
        TaskId = taskId;
    }
    public int TaskId { get; private set; }
}

public class TaskControl : UserControl
{
   public event EventHandler<TaskChangedEventArgs> TaskChanged;

   // raise it inside button click event handler
   protected void OnTaskChanged(int taskId)
   {
       if (TaskChanged != null)
           TaskChanged(this, new TaskChangedEventArgs(taskId));
   }
}

ユーザーコントロールを使用するときは、そのTaskChangedイベントをサブスクライブするだけです。

uct.TaskChanged += new EventHandler<TaskChangedEventArgs>(uct_TaskChanged);

また、イベント引数を介して渡したすべてのパラメーターは、そのイベントハンドラーで使用できます。

void uco_TaskChanged(object sender, TaskChangedEventArgs e)
{
    lblStatus.Text = e.TaskId.ToString();
}
于 2012-04-04T13:51:38.440 に答える
2

さて、送信者はユーザーコントロール権である必要がありますか?次に、を使用してアイテムをキャストおよび決定できますucTask.id

void uco_OnButtonclick(object sender, EventArgs e)
{
    ucTask uc = sender as ucTask;
    lblStatus.Text = uc.id.ToString();
}

OnButtonclickこれは、ユーザーコントロールのイベントが、イベントの送信者として押されたボタンへの参照ではなく、ユーザーコントロールへの参照を送信することを前提としています。

于 2012-04-04T13:52:11.010 に答える