Как я захватываю события от подсредств управления на пользовательском элементе управления в Приложении WinForms?

Это невозможно стандартным способом в MySQL. Вы должны использовать триггер.

Например, следующее сравнивает значение ID_USER, которое было передано в операторе обновления, с именем текущего пользователя базы данных и прерывает обновление, если они отличаются, используя синтаксис SIGNAL , чтобы поднять ошибку.

DELIMITER $

CREATE TRIGGER checkUpdateTable1
BEFORE UPDATE ON Table1
FOR EACH ROW
BEGIN

    SELECT 1 
    FROM mysql.user 
    INTO @is_root
    WHERE super_priv='Y' AND USER() = CONCAT(user, '@', host); 

    IF (@is_root IS NULL AND NEW.ID_USER <> USER()) THEN
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'error message';
    END IF
END
$
DELIMITER ;

Примечание: после комментария Рэймонда Нейланда я отредактировал пост, чтобы пользователи SUPER могли обновить любую строку.

11
задан Brock Greman 2 October 2008 в 15:45
поделиться

4 ответа

Лучшая практика должна была бы выставить события на UserControl тот пузырь события до родительской формы. Я шел вперед и соединил пример для Вас. Вот описание того, что обеспечивает этот пример.

  • UserControl1
    • Создайте a UserControl с TextBox1
    • Зарегистрируйте общественное мероприятие на UserControl названный ControlChanged
    • В UserControl зарегистрируйте обработчик событий для TextBox1 TextChangedEvent
    • В TextChangeEvent функция-обработчик я звоню ControlChanged событие для пузырения к родительской форме
  • Form1
    • Отбросьте экземпляр UserControl1 на разработчике
    • Зарегистрируйте обработчик событий на UserControl1 для MouseLeave и для ControlChanged

Вот снимок экрана, иллюстрирующий что ControlChanged событие, которое я определил на UserControl доступно через UX в Visual Studio на родительской форме Windows.

Обработчики событий для пользовательского элемента управления http://friendfeed.s3.amazonaws.com/0d5a3968cb785625c8afb3974a8d84894c476291

15
ответ дан 3 December 2019 в 05:59
поделиться

Лучшая модель для этого вида вещи будет создавать пользовательские события на Вашем пользовательском элементе управления и повышать их в подходящее время.

Ваш сценарий довольно сложен, но не неслыхан. (Я нахожусь на самом деле в очень похожем режиме на одном из моих текущих проектов.) Способ, которым я приближаюсь к нему, состоит в том, что пользовательский элемент управления ответственен за свою собственную проверку. Я не использую CausesValidation; вместо этого в соответствующей точке пользовательского элемента управления, я выполняю проверку посредством переопределения ValidateChildren (). (Это обычно происходит, когда пользователь нажимает "Save" или "Next" на пользовательском элементе управления для меня.)

Не будучи знакомым с Вашим пользовательским элементом управления UI, который не может составить 100% правильный подход для Вас. Однако, если Вы генерируете пользовательские события (возможно с пользовательским EventArgs, который указывает, выполнить ли проверку), необходимо смочь добраться, где Вы хотите быть.

2
ответ дан 3 December 2019 в 05:59
поделиться

Вам нужно будет подключить события, которые вы хотите фиксировать внутри вашего пользовательского элемента управления, и опубликовать их через некоторые пользовательские свойства событий в самом пользовательском элементе управления. Простым примером может быть обертывание события нажатия кнопки:

// CustomControl.cs
// Assumes a Button 'myButton' has been added through the designer

// we need a delegate definition to type our event
public delegate void ButtonClickHandler(object sender, EventArgs e);

// declare the public event that other classes can subscribe to
public event ButtonClickHandler ButtonClickEvent;

// wire up the internal button click event to trigger our custom event
this.myButton.Click += new System.EventHandler(this.myButton_Click);
public void myButton_Click(object sender, EventArgs e)
{
  if (ButtonClickEvent != null)
  {
    ButtonClickEvent(sender, e);
  }
}

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

// CustomForm.cs
// Assumes a CustomControl 'myCustomControl' has been added through the desinger
this.myCustomControl.ButtonClickEvent += new System.EventHandler(this.myCustomControl_ButtonClickEvent);
myCustomControl_ButtonClickEvent(object sender, EventArgs e)
{
  // do something with the newly bubbled event
}
2
ответ дан 3 December 2019 в 05:59
поделиться

Я хотел бы отметить, что, как описано, на самом деле это звучит так, как будто вы преследуете отвлекающий маневр. Хотя кажется, что у вас есть ситуация, когда отсутствие пузырьков событий в WinForms вызывает у вас проблемы, на самом деле плохая архитектура вынуждает вас нуждаться в пузырях событий, когда вы этого не должны.

Если вы можете провести рефакторинг / реструктуризацию своего дизайна таким образом, чтобы элементы управления работали с общей моделью данных (очевидный выбор - MVC / MVP), тогда вы можете просто применить общие шаблоны WinForms, такие как события PropertyChanged, в модели, чтобы сообщить вашей основной форме и любые другие элементы управления, которые используют эти данные для обновления.

Короче говоря, другие ответы разумны в том смысле, что они отвечают на заданный вопрос. Но с точки зрения качества кода, я думаю, что лучший ответ - отделить данные от пользовательского интерфейса.

0
ответ дан 3 December 2019 в 05:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: