2012-04-20 5 views
0

В настоящее время есть mainForm.cs, который называет класс panel.csC функция # вызов от внешнего текущего класса

panel.cs имеет несколько PictureBoxes с событиями, такими как _click, _mousedown, _mouseup

Я хочу позвонить функция в mainForm.cs от panel.cs

Мне нужно использовать обратный вызов/делегат. Есть ли другой способ доступа к этой функции

Я пробовал Главная main = new Main(); main.functioninMain не работает

любая помощь или руководство будет оценено.

, например

panel.cs 
    private void pb_button1_Click(object sender, EventArgs e) 
    { 
    this.BeginInvoke(new Action(main.functioninMain)); 
    } 

ответ

1

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

подход 1 Вы можете попробовать создать статический экземпляр вы MainForm, как показано ниже

public partial class MainForm : Form 
{ 
    public static MainForm Instance = null; 
    public MainForm() 
    { 
     InitializeComponent(); 
     Instance = this; 
    } 
    public SomeMethod() 
    { 
    } 
} 

Теперь, если у вас есть класс панели, то вы можете легко получить доступ к общим методам и переменным MainClass

class Panel : Form 
{ 
    public Panel() 
    { 
     MainForm.Instance.SomeMethod(); 
    } 

} 

Редактировать: передать ручку в качестве параметра к форме (Из предложения Бена Фойгта)

подход 2:

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

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

    private void button1_Click(object sender, EventArgs e) 
    { 
     TestClass test = new TestClass(); 
     test.ModifyText(textBox1); 
    } 
} 

public class TestClass 
{ 
    public void ModifyText(TextBox textBox) 
    { 
     textBox.Text = "New text"; 
    } 
} 
+1

Это, вероятно, будет работать для главного окна, так как должен быть только один, но более чистый подход - передать дескриптор родительскому объекту при создании панели. –

+0

работа!спасибо soooo много! – justin89

+0

@BenVoigt: Да, я согласен с вашим предложением и, следовательно, обновил ответ с помощью подхода к передаче дескриптора элементов управления для их обработки. – Marshal

0

Вы должны избегать круговых зависимостей любой ценой (класс А зависит от класса В, а класс В зависит от класса А).

Существует так много способов сделать это, но, возможно, одним из самых простых способов является использование интерфейса. mainForm.cs реализует это следующим образом:

public class mainForm : IMainForm { 
    // This method is defined in the interface, so mainForm 
    // must implement it. 
    public string GetStringFromMainForm() { 
    return "Hello from MainForm"; 
    } 

    public void CreatePanel() { 
    // pass in a reference to myself so panel knows how to 
    // talk to me. 
    var panel = new Panel(this); 
    } 
} 

И IMainForm (интерфейс) может выглядеть следующим образом:

public interface IMainForm { 
    string GetStringFromMainForm(); 
} 

Тогда ваш класс панель может говорить с главной форме без ссылки mainForm.cs явно:

public class Panel { 
    // use a private variable to keep track of main form 
    private IMainForm _mainForm; 

    // Constructor: pass in a class that implements IMainForm. It isn't 
    // a type of MainForm, so there's no dependency on the concrete class. 
    public Panel(IMainForm mainForm) { 
    _mainForm = mainForm; 
    } 

    public void TalkToMainForm() { 
    var resultFromMainForm = _mainForm.GetStringFromMainForm(); 
    Console.WriteLine(resultFromMainForm); 
    } 
} 
1

Если мы можем использовать делегат & события что-то вроде этого

public partial class MainForm : Form 
{ 
     public MainForm() 
     { 
      InitializeComponent(); 
     } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Panel formPanel = new Panel(); 
     formPanel.OnPanelClick += new Panel.OnPanelButtonClick(formPanel_OnPanelClick); 
     formPanel.Show(); 
    } 

    void formPanel_OnPanelClick(string a) 
    { 
     MessageBox.Show(a); 
    } 
} 

public partial class Panel : Form 
{ 
    public delegate void OnPanelButtonClick(string a); 
    public event OnPanelButtonClick OnPanelClick = null; 

    public Panel() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (OnPanelClick != null) 
     { 
      OnPanelClick("from Panel.cs"); 
     } 
    } 
} 
Смежные вопросы