2012-04-04 12 views
1

für ein aktuelles Projekt Ich füge eine variable Menge an usercontrols : ucTask meiner flowlayoutpanel : flpTasksWelche Taste hat das Flowlayoutpanel gedrückt?

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

Jetzt werde ich ein paar dieser Benutzersteuerelemente in der Flowlayoutpanel haben, und ich möchte ein Ereignis ausgelöst, wenn Ich drücke diesen Knopf. Mit der EventHandler kann ich ein Ereignis auslösen, aber ich muss ein anderes Ereignis für eine andere Schaltfläche auslösen.

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

Ich weiß nicht, wie die Taste (oder Usercontrol) wissen, drückte ich. Und mir fehlen Ideen, irgendwelche Vorschläge?

Danke, Thomas

Antwort

2

Sender der Veranstaltung ist tatsächlich eine der Tasten. Wenn Sie Absender-Knopf-Typ umgewandelt, können Sie eine der Tasten Eigenschaften zugreifen und bestimmen, welche Taste gedrückt wurde:

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

    lblStatus.Text = button.Name; 
} 

UPDATE: nachdem Ihre Frage noch einmal zu lesen, bekomme ich, dass ucTask tatsächlich Usercontrol, das Ereignis steigt, wenn Taste drinnen wurde geklickt.

Also, zuerst ist Benennung. Guter Stil für Klassennamen in C# ist PascalCase. Z.B. Für die Aufgabe Benutzerkontrolle wird der Name TaskControl sein. Weiter geht die Benennung von Ereignissen. Es ist üblich, Ereignisse als EventName(-ing, -ed) zu benennen. Wenn Sie ein Ereignis auslösen möchten, dann ist der gute Stil die geschützte Methode OnEventName(-int, -ed). Und noch eine Bemerkung: Wenn Sie Benutzersteuerelemente schreiben, können Sie Geschäftsbegriffe verwenden, um Ihre Ereignisse zu benennen. Z.B. TaskCreated, TaskChanged. Sie können auch beliebige Parameter an Ihr Ereignis übergeben, indem Sie benutzerdefinierte EventArgs erstellen.

Also, für Ihre Benutzersteuerung:

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)); 
    } 
} 

Wenn Sie Ihre Benutzersteuerung verwenden, abonnieren Sie seine TaskChanged Veranstaltung:

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

und alle Parameter, die Sie über Event-Argument übergeben wird in diesem Event-Handler zur Verfügung stehen:

+0

Das hat funktioniert, vielen Dank! Ich hatte zuerst Fehler, weil mein 'Button' eigentlich kein' Button' ist, es ist eine 'Picturebox'. Sobald ich daran dachte, habe ich alles funktioniert, Danke! (Gibt es eine gute Alternative für Schaltflächen, wenn Sie Ihr eigenes Bild verwenden möchten?) – Schoof

+0

@ThomasSchoof bitte überprüfen Sie mein Update. Es gibt einige Designempfehlungen für deine :) –

+0

Wow danke, das sind einige sehr hilfreiche Tipps, die ich sicher in meinen Projekten verwenden werde. Ich werde meine usercontrols für dieses Projekt nicht umbenennen, weil ich all meine userscontrols benannt habe: ucName und my forms: frmName. – Schoof

2

Nun, der Absender sollte der Benutzer co sein Nein, oder? Dann können Sie den Gegenstand durch ucTask.id werfen und bestimmen.

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

Dies setzt voraus, dass die OnButtonclick Ereignis der Benutzersteuerung eine Referenz auf die Benutzersteuerung sendet und kein Hinweis auf die gedrückte Taste als Absender des Ereignisses.

+0

Danke, die gleiche Antwort wie @lazyberezovsky und es hat funktioniert. – Schoof

+0

Eigentlich hat er die selbe Antwort wie ich ;-) –

+0

Naja, ich kann keine 2 Antworten annehmen :( – Schoof

Verwandte Themen