| 

.NET C# Java Javascript Exception

4
Hallo Zusammen,
Ich habe ein Steuerelement in vb.net gebaut dass aus mehreren Controls besteht.
Dieses Steuerelement soll beim Ereignis MouseDown ein Event werfen, dass ausserhalb des Steuerelements behandelt werden soll. Wenn ich das Steuerelement selbst anklicke (quasi das panel im Hitergrund) funktioniert das auch soweit. Aber auch der Click auf eines der Controls soll dieses Ereignis auslösen.

Egal was ich probiere, es wird von der Form die das Steuerelement beinhaltet nur der Klick auf das panel registriet, aber nicht der Klick auf einem der Unterelemente im Steuerelement.

Ich kann ja nicht der erste sein der das braucht...
Hat einer ne Idee?

Danke,
Daniel
News:
06.02.2013
schlumpfger 288 1 8
4 Antworten
1
Wie wäre es mit folgender Variante:
Rekursiv für alle Child-Controls das MouseDown-Event auf einen einzigen Handler legen und in diesem dann das MouseDown des Parent auszulösen? Das ControlAdded Event hilft, auch noch solche einzufangen, die erst "später" hinzukommen.
Ich bin des VB.NET nicht wirklich mächtig, wenn Dir ein C# Beispiel weiterhilft, melde Dich nochmal, dann poste ich eines.

UPDATE : Hier das C# Beispiel:
Ich hab einfach ein neues WinForms Projekt erstellt, daher die Form1. Der relevante Code für das UserControl und EventHandling ist enthalten. HTH.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ParentUserControl parentControl = new ParentUserControl();
parentControl.MouseDown += parentControl_MouseDown;
this.Controls.Add(parentControl);
}

private void parentControl_MouseDown(object sender, MouseEventArgs e)
{
MessageBox.Show("Parent.MouseDown Event");
}
}

public class ParentUserControl : UserControl
{
public ParentUserControl()
{
// add some controls to parent user control
for (int i = 0; i < 5; i++)
this.Controls.Add(new Button()
{
Text = "Button " + i,
Location = new System.Drawing.Point(0, i * 20)
});

// register all MouseDown handlers of all child controls
foreach (Control c in this.Controls)
RegisterMouseDownEvents(c);
}

private void RegisterMouseDownEvents(Control control)
{
control.MouseDown += control_MouseDown;

// if you want the recursion, just uncomment the following lines
//foreach (Control childControl in control.Controls)
// RegisterMouseDownEvents(childControl);
}

private void control_MouseDown(object sender, MouseEventArgs e)
{
// this is the single handler for all child controls
this.OnMouseDown(e);
}
}
08.02.2013
ffordermaier 8,4k 3 9
0
Ich würde in dem Steuerelement ein eigenes Event definieren, welches ich in den Eventbehandlungsmethoden der Kind-Steuerelemente feuere. Ich habe als Beispiel ein UserControl mit einer Checkbox angelegt, welches ich in ein Formular eingebunden habe. Der Code hierfür sieht in etwa so aus:

Public Class UserControl1

Public Event ItemClicked()

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged

RaiseEvent ItemClicked()

End Sub

End Class

Public Class Form1

Private Sub UserControl11_ItemClicked() Handles UserControl11.ItemClicked

Label1.Text = "Checkbox on Usercontrol was clicked"

End Sub

End Class


Gruß
Klaus
08.02.2013
luedi 2,2k 1 9
0
Danke für den Vorschlag,

aber ein eigenes Event auslösen ist keine Alternative, da ich eine Vielzahl von Controls (nicht alle benutzerdefiniert) habe, bei denen immer auf das Event Control.MouseDown verwiesen wird.

Es ist sogar noch schlimmer. Die Controls werden per später Bindung geladen. Da ich aber nicht weiss was das für Controls sind kann ich nur auf Standardeigenschaften von system.Windows.Forms.Control zurückgreifen.

Es geht also darum, dass Control.MouseDown Event mit allen SubControls auszulösen...
08.02.2013
schlumpfger 288 1 8
0
Ja sowas suche ich. Es muss nicht mal rekusiv sein. Bei den Controls die komplexer sind (also ein Control mit Controls) kann ich das MouseDownEvent bei den UnterControls auch umlenken... wenn du mir sagst wie :) . Diese Controls erstelle ich selbst und ha so den zugriff auf den Code.

gerne auch in C#, das schicke ich dann durch nen Konverter...
08.02.2013
schlumpfger 288 1 8
Siehe mein Update. Hilft Dir das weiter?
ffordermaier 08.02.2013
BTW: Bitte nutze für Anmerkungen die Kommentarfunktion und erstelle nicht neue Antworten.
ffordermaier 08.02.2013
Vielen Dank!!! Der Ansatz hat super geholfen!
schlumpfger 11.02.2013

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH