как подписаться на событие usercontrol - PullRequest
0 голосов
/ 13 декабря 2010

У меня есть группа пользовательских контролов, которые я использую несколько раз в своей форме. Пользовательские элементы управления содержат текстовое поле, поле со списком или флажок и метод get value для возврата значения его соответствующего элемента управления. Обычно у меня есть кнопка в форме, событие нажатия которой вызывает функцию getValue usercontrols, но теперь мне нужно, чтобы что-то происходило в форме всякий раз, когда происходит событие изменения элементов управления, контролируемого пользователем Что-то вроде следующего. В form1.cs

form1.Controls.Add(UserControl1);
form1.Controls.Add(UserContorl2);
// gets called every time the combobox on UserControl1 has it's
// ValueChanged event raised
private void UserControl1_Changed(object Sender, EventArgs e)
{
    form1.property1 = UserControl1.getValue();
}
// gets called everytime the textbox on UserControl2 has it's
// textChanged event raised
private void UserControl2_Changed(object Sender, EventArgs e)
{
    form1.property2 = UserControl2.getValue();
}

Я не могу понять, как бросить / поймать это событие в форме. Я использую VS 2005.

вот код в одном из моих пользовательских контролей. txtValue представляет собой текстовое поле

public partial class StringParameterControl : BaseParameterControl
{
    public StringParameterControl(string aName, string aValue)
        : base(aName)
    {
        InitializeComponent();
        txtValue.Text = aValue;
    }
    public StringParameterControl(string aName)
        : base(aName)
    {
        InitializeComponent();
    }
    public StringParameterControl()
        : base()
    {
        InitializeComponent();
    }
    public void SetValue(string aValue)
    {
        txtValue.Text = aValue;
    }
    public override object GetValue()
    {
        return txtValue.Text;
    }
}

Ответы [ 3 ]

2 голосов
/ 13 декабря 2010
UserControl1.Changed += UserControl1_Changed;

Обновите свой элемент управления, включив в него следующее:

// A delegate type for hooking up change notifications.
// This is _what kind_ of event you want. It sets the signature your event handler methods must have.
public delegate void ChangedEventHandler(object sender, EventArgs e);

//the actual event
public event ChangedEventHandler Changed;

// Method to raise/fire the Changed event. Call this whenever something changes
protected virtual void OnChanged(EventArgs e) 
{
    ChangedEventHandler handler = Changed;
    if (handler != null) handler(this, e);
}

//and update your existing SetValue() function like so:
public void SetValue(string aValue)
{
    txtValue.Text = aValue;
    OnChanged(EventArgs.Empty);
}

Вы можете изменить свою подпись на мероприятии, чтобы передавать любую информацию, которую хотите & mdash; например старое или новое значение свойства (или оба). Я просто использовал стандартные аргументы события для примера.

И говоря, или свойства, не пишите отдельные методы Get / Set в C #, как вы только что написали. Если вы обнаружите, что делаете это, вы, вероятно, захотите использовать вместо этого свойство, которое автоматически обеспечит правильную семантику get / set:

public string Value 
{ 
    get { return txtValue.Text;} 
    set {txtValue.Text = value; OnChanged(EventArgs.Emtpy); } 
}
0 голосов
/ 13 декабря 2010

Или вы можете использовать стиль вывода типа.

       UserControl.Changed = (sender, e) => this.controlFired = true; //or whatever

Изменено - это открытое событие, которое вы выставляете через свойство в вашем элементе управления с типом делегата (void (отправитель объекта, EventArges e)).Вы можете посмотреть, как опубликовать событие на msdn - об этом много статей.

0 голосов
/ 13 декабря 2010

Насколько я понимаю, пользовательские элементы управления, которые вы используете, не запускают события при изменении их значения, поэтому вы не можете просто подписаться на какое-то событие "ValueChanged".Возможное решение может заключаться в том, чтобы найти интересующий вас элемент управления (Combobox, Textbox и т. Д.) В коллекции usercontrols «Controls» и напрямую подписаться на соответствующие события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...