in UserControl auf btn zugreifen

realYeti

Mitglied
Hy Leute, als erstes mal Hallo - Ich hab hier schon einiges gelesen, aber nix passendes für mein Problem gefunden.

Zu meinem Problem:

Ich lade ein eigenes Usercontrol in ein Panel in meine Main - in dem Usercontrol befindet sich ein Editfeld(tbxTest = Textbox). Nun habe ich ein Feld das Read Only = True ist, und das hätte ich nun gerne über das MainFormular über einen Handler (Click) ReadOnly = False gemacht. nun ist aber die Frage wie ich auf das Usercontrol zugreifen kann im Main.

Dies ist nur der Anfang der Lawine, da ich auch noch error Provider Platzieren und behandeln soll im Main.

Im Main rufe ich die Routine zum erstellen des Usercontrols auf:

Code:
Private Sub DetailPanel(ByVal ktonr As Integer, ByVal name1 As String)

        Try
            Panel1.Controls.Clear()
            Dim newControl As New controlDetail(ktonr, name1)
            'Panel1.Controls.Clear()
            newControl.Name = "DetailRechnung"
            Panel1.Controls.Add(newControl)
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.YesNo)
        End Try

    End Sub

Hoffe einer von Euch weis Rat - THX

Yeti :D
 
Du willst den Status ja vermutlich ändern, weil in deinem UserControl etwas passiert ist, oder? Dann wäre es ganz gut, wenn das UserControl bei dieser Änderung ein Event wirft, welches dann in deiner Formular-Klasse abgefangen wird (dort kann dann entsprechend darauf reagiert werden). Auf die gleiche Weise kannst du das mit diversen Validierungen machen. Die Validierung findet ja in deinem UserControl statt. Daher kannst du ja selbst bestimmen, wann und in welcher Form ein Event losgetreten wird.

Nehmen wir folgendes UserControl (das ist lediglich eine Ableitung einer TextBox):
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace EventDemo
{
    public delegate void ValidationHandler(object sender, ValidationEventArgs e);

    public partial class TextBoxEx : TextBox
    {
        public TextBoxEx()
        {
            InitializeComponent();

            this.Leave += new EventHandler(TextBoxEx_Leave);
        }

        void TextBoxEx_Leave(object sender, EventArgs e)
        {
            bool isValid = false;

            if (this.Text == "sample")
                isValid = true;

            if (this.OnItsValidated != null)
                this.OnItsValidated(this, new ValidationEventArgs(isValid));
        }



        public event ValidationHandler OnItsValidated;
    }

    public class ValidationEventArgs : EventArgs
    {
        private bool _isValid = true;

        public bool IsValid
        {
            get { return this._isValid; }
            set { this._isValid = value; }
        }

        public ValidationEventArgs(bool isValid)
        {
            this._isValid = isValid;
        }
    }
}
Hier wird innerhalb des UserControls das Ereignise Leave abgefangen und eine kleine Validierung vorgenommen (macht zwar keinen Sinn, aber zur Veranschaulichung reicht es).

Zusätzlich haben wir eigene EventArgs definiert -> ValidationEventArgs. Diesen können wir mitgeben, ob der Eintrag gültig ist oder nicht. Zusätzlich haben wir ganz oben einen Delegaten definiert und ein zusätzliches Event.

In einem Beispiel (Windows Forms) wird das Control dynamisch erzeugt und das Event OnItsValidated abonniert. Darin kann dann entsprechend in der Form agiert werden (in diesem Fall wird nur eine MessageBox ausgegeben.

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace EventDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            TextBoxEx ex = new TextBoxEx();
            ex.Name = "TestBox";
            ex.Text = "TestBox";
            ex.OnItsValidated += new ValidationHandler(ex_OnItsValidated);
            ex.Location = new Point(0, 0);
            this.Controls.Add(ex);
        }

        void ex_OnItsValidated(object sender, ValidationEventArgs e)
        {
            if (e.IsValid)
                MessageBox.Show("It is valid");
            else
                MessageBox.Show("It is not valid");
        }
    }
}

Ich hoffe, dass es nun etwas klarer ist.
 
Hy eine Event auszulösen wäre wohl in meinem Fall nicht das richtige, da ich den Status des Buttons ja eigentlich schon an ein Event bindem möchte.

Sprich "Storno Btn Click" - status der Readonly Eigenschaft der Textbox im UC auf False.

Danke aber trozdem für deine Hilfe - werd weitertesten.

Gruß

Yeti :D
 
Aso, du brauchst es also anders rum. D.h. du hast auf deinem Formular ein Feld, wenn sich dessen Wert ändert, sollte das Feld in dem UC disabled werden?

Dann kannst du ja das gesamte UC auf disabled setzen, dann sollte die TextBox auch nicht verfügbar sein. Solltest du noch etwas anderes machen wollen, dann biete im UserControl eine öffentliche Eigenschaft an, mit deren Hilfe du die entsprechenden Werte setzen kannst.
 
Hmmm.. na ja hab die Business Logic umgebaut, und mir ne globale Variable gemacht - ist zwar so nicht "sauber" gecodet, aber hilft mir einstweilen aus der Not. Werd mir des nochmal durch den Kopf gehen lassen mit den Handlern.

THX für Deine Hilfe

Yeti :D
 
Zurück