awaisshabir Ответов: 1

У меня есть usercontrol, и в этом usercontrol я создаю один делегат для вызова метода winform?


В моем приложении у меня есть только одна форма, остальные - это пользовательский контроль.когда я сохраняю новую запись, сообщение будет мне показано клиенту в основной форме, все идет нормально, но оно не показывает сообщение в основной форме alertpanel lable.
public delegate void MessageAlert(string Message,AlertNotification enumNotification);
    public partial class ManageTenant : UserControl
    {
       
        public MessageAlert CallBack { get; set; }

        private async void ManageTenant_Load(object sender, EventArgs e)
        {
          CallBack("Load Successfully",AlertNotification.Success);
        }

}
Вот мой код формы:
public partial class Main : Form
    {

        Timer timer;
        public Main()
        {
            InitializeComponent();


        }

        private void Main_Load(object sender, EventArgs e)
        {

            this.WindowState = FormWindowState.Maximized;
            this.MinimumSize = this.Size;
            this.MaximumSize = this.Size;

            ManageTenant manageTenant = new ManageTenant();
            manageTenant.CallBack = new MessageAlert(DisplayAlert);
            
        }

        public void DisplayAlert(string message, AlertNotification enumAlertNotification)
        {
            timer = new Timer();

            if (AlertNotification.Success == enumAlertNotification)
            {
                this.AlertPanel.BackColor = Color.YellowGreen;
                this.lblMessage.Text = message;

                #region hideAlertMessage
                timer.Interval = 2000;
                timer.Tick += (s, e) =>
                {
                    this.AlertPanel.Visible = false;
                    timer.Stop();
                };
                timer.Start();
                #endregion
            }
            
        }
}


Что я уже пробовал:

Я создаю делегат в своем пользовательском элементе управления для доступа к методу winform, но ничего не показываю. Вот мой код:
public delegate void MessageAlert(string Message,AlertNotification enumNotification);
    public partial class ManageTenant : UserControl
    {      
        public MessageAlert CallBack { get; set; }

        private async void ManageTenant_Load(object sender, EventArgs e)
        {
          CallBack("Load Successfully",AlertNotification.Success);
        }
}
Вот код формы:
public partial class Main : Form
    {

        Timer timer;
        public Main()
        {
            InitializeComponent();


        }

        private void Main_Load(object sender, EventArgs e)
        {

            this.WindowState = FormWindowState.Maximized;
            this.MinimumSize = this.Size;
            this.MaximumSize = this.Size;

            ManageTenant manageTenant = new ManageTenant();
            manageTenant.CallBack = new MessageAlert(DisplayAlert);
            
        }
public void DisplayAlert(string message, AlertNotification enumAlertNotification)
        {
            timer = new Timer();

            if (AlertNotification.Success == enumAlertNotification)
            {

                this.AlertPanel.BackColor = Color.YellowGreen;
                this.lblMessage.Text = message;

                #region hideAlertMessage
                timer.Interval = 2000;
                timer.Tick += (s, e) =>
                {
                    this.AlertPanel.Visible = false;
                    timer.Stop();
                };
                timer.Start();
                #endregion
            }
            
        }

BillWoodruff

Я хотел бы увидеть, как вы ответите на вопрос, заданный в вашем другом недавнем посте об этом проекте, и ответите на предлагаемые решения.

Если вы размещаете и показываете UserControls, которые создаются и загружаются при запуске вашего проекта, но не помещаются в форму или другую коллекцию ControlCollection, если все UserControls имеют одинаковый размер, и только один из них отображается в любой момент времени ... это очень простой сценарий.

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

awaisshabir

Спасибо за ответ .
в моем приложении winform у меня есть только одна основная форма,в которой у меня есть строка меню, Панель alertpanel и панель контейнеров . а остальное - это пользовательский контроль.
если я нажму, например, меню employee, то employee user control load in the container panel. if i add new record in the employee the message is show in the AlertPanel like " Successfully Insert record."

1 Ответов

Рейтинг:
2

OriginalGriff

Более простым решением было бы создать событие в вашем UserControl и подписаться на него из вашей формы - и это соответствует модели, которую также используют все другие элементы управления.
Это довольно тривиально, но я ленив - поэтому я написал фрагмент, чтобы сделать его еще проще: Простой фрагмент кода для добавления события[^]
Теперь все, что я делаю, это набираю "evh" и дважды нажимаю TAB, и все готово.

Ваш метод обратного вызова не проверяет, есть ли назначенный обратный вызов - что и должно быть, - но в остальном он выглядит нормально на случайный взгляд. Единственное, чего он не делает, - это делает AlertPanel видимым в любой момент, хотя он скрывает его шесть раз. Я бы предложил использовать отладчик, чтобы проверить, что именно происходит - я подозреваю, что он не работает, потому что вы вообще никогда не видите панель.