C # - вызов функции из другой формы - PullRequest
1 голос
/ 21 ноября 2011

Мне нужно уведомить лоток из другой формы. ControlPanel.cs (форма по умолчанию, уведомление здесь):

  ...
  public partial class ControlPanel : Form
    {
        public string TrayP
        {
            get { return ""; }
            set { TrayPopup(value, "test");}

        }

   public void TrayPopup(string message, string title)
    {
        TrayIcon.BalloonTipText = message;
        TrayIcon.BalloonTipTitle = title;
        TrayIcon.ShowBalloonTip(1);
    }

Form1.cs (другая форма):

...
public partial class Form1 : Form
{

    public ControlPanel cp;
    ....

    private void mouse_Up(object sender, MouseEventArgs e) {
        cp.TrayP = "TRAY POPUP THIS";
    }

В сети cp.TrayP = "TRAY POPUP THIS"; Я получаю исключение NullException. Если я изменяю его на cp.TrayPopup("TRAY POPUT THIS", "test");, исключение выдает что угодно.

Если я сделаю это:

private void mouse_Up(object sender, MouseEventArgs e) {
    var CP = new ControlPanel();
    CP.TrayPopup("TRAY POPUP THIS", "test");
}

, всплывающее окно в трее показывает, но оно создает второй значок в трее, а затем показывает подсказку с новым значком. Что я могу сделать? П.С .: Извините за плохой английский.

Ответы [ 3 ]

2 голосов
/ 21 ноября 2011

Если вы открываете вторую форму "Form1" из ControlPanel, вы должны передать экземпляр CP в Form1, например

public partial class ControlPanel : Form
{

    public void ShowForm1(){
        FOrm1 f1 = new Form1();
        f1.SetCp(this);
        f1.show();
    }

    public void TrayPopup(string message, string title)
    {
        TrayIcon.BalloonTipText = message;
        TrayIcon.BalloonTipTitle = title;
        TrayIcon.ShowBalloonTip(1);
    }
}

public partial class Form1 : Form
{

    public ControlPanel _cp;
    public void SetCP(controlPanel cp){
            _cp = cp;
    }

    private void mouse_Up(object sender, MouseEventArgs e) {
            if(_cp != null)
            _cp.TrayPopup("TRAY POPUP THIS", "test");
    }
}
0 голосов
/ 21 ноября 2011

Ваша переменная public ControlPanel cp; имеет нулевую ссылку, поскольку она никогда не инициализируется. Чтобы получить доступ к ControlPanel, вам нужно установить действительную ссылку на него. Если ваш ControlPanel.cs находится в другой форме, вам нужно получить эту ссылку оттуда. Либо через публичную собственность или интерфейс.

0 голосов
/ 21 ноября 2011

не нужно каждый раз выделять память, попробуйте это

public partial class Form1 : Form
{

    public ControlPanel cp = new ControlPanel();
    ....

    private void mouse_Up(object sender, MouseEventArgs e) {   
    CP.TrayPopup("TRAY POPUP THIS", "test");
    }
}
...