2015-08-26 3 views
0

Я сделал один класс «start», класс формы и класс Adder.Метод вызова не работает

Я хочу, чтобы добавить элементы в listbox1 в Form1 из класса сумматор ...

... но это не делает его!

Там нет ошибки или что-то подобное, и когда я его отладки, кажется, работает, но нет ни одного элемента в ListBox после кнопки 2 нажатия (я отметит это в коде)

Я знаю, что я вызовите функцию AddValue() в классе Form1 (и затем она работает ... я не знаю почему), но я хочу сделать это из другого класса, потому что это не программа дыр, а только часть, которая создает проблемы ,

namespace WindowsFormsApplication4 
{   

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

    private void button1_Click(object sender, EventArgs e) 
    { 
     string command2 = "ipconfig"; 
     string command = "telnet " + comboBox1.Text + " 13000"; 
     processInfo = new ProcessStartInfo("cmd.exe", "/k " + command2); 
     Process process = Process.Start(processInfo); 
    } 

    public void AddValue(string value) 
    { 
     listBox1.Items.Add(value); 
    } 

    private void button2_Click(object sender, EventArgs e) // here it "starts" 
    { 
     Adder adder_objet = new Adder(); 
     adder_objet.Add(); 
    } 
} 
public class Adder 
{ 

    public void Add() 
    { 
     Form1 form1_objet = new Form1(); 
     form1_objet.AddValue("sfdg"); 
    } 

} 
} 
+3

'new' создает * новый * экземпляр, так что да, вы открываете новую форму, добавьте значение' sfdg' к нему , то метод заканчивается, 'form1_objet' выходит за пределы области и форма располагается. – Sayse

ответ

1

не совсем уверен, что ваш дизайн, но это исправит это:

public class Adder 
{ 

    public void Add(Form1 myForm) 
    { 
     myForm.AddValue("sfdg"); 
    } 

} 

то в вашей мыши:

private void button2_Click(object sender, EventArgs e) // here it "starts" 
{ 
    Adder adder_objet = new Adder(); 
    adder_objet.Add(this); 
} 
+0

спасибо, что это почти то, что я хочу;) –

+0

, но как я могу вызвать функцию добавления без использования «этого»? ... он работает, если button2_click находится в Form1 class, но тогда я могу назвать это также прямо так, как –

+0

listBox1.Items.Add ("rfg") –

1

Adder класс не добавляя к тому же экземпляру Form1. Попробуйте изменить его следующим образом:

общественного класса Adder {

public void Add(Form1 form1_objet) 
{ 
    form1_objet.AddValue("sfdg"); 
} 

}

А потом называют это так:

private void button2_Click(object sender, EventArgs e) // here it "starts" 
    { 
     Adder adder_objet = new Adder(); 
     adder_objet.Add(this); 
    } 
+0

Я печатал то же время, что и вы. Обратите внимание, что вы передаете Form1 в конструктор Adder при вызове из события, но тогда класс Adder ожидает его в методе добавления – GinjaNinja

+0

@GinjaNinja Спасибо! Я исправил это. Это то, что происходит, когда вы не используете IDE :) – Nevca

0

Вы звоните AddValue на новый экземпляр Form1.

Вместо создать статическое свойство, которое возвращает вашу главную форму, созданную экземпляр во время Application.Run

Declare это в Program классе

public static Form1 MainForm { get; private set; } 

и заменить Application.Run с этим

MainForm = new Form1(); 
Application.Run(MainForm); 

Возможно, вы также захотите сделать свой класс Program общественности.

Наконец, в вашем методе Adder.Add вы должны позвонить MainForm из вашего Program класса.

public class Adder 
{ 
    public void Add() 
    { 
      Form1 form1_objet = new Form1(); 
     form1_objet.AddValue("sfdg"); 
    } 
} 

Конечно, есть несколько вещей, которые я хотел бы смотреть модифицирована здесь, если вам действительно нужен новый экземпляр Adder каждый раз, а затем объявить метод Add, как статический и, возможно, класса в целом, как это

public static class Adder 
{ 
    public static void Add() 
    { 
     Form1 form1_objet = new Form1(); 
     form1_objet.AddValue("sfdg"); 
    } 
} 

Конечно, некоторые из вышеперечисленных функций зависят от того, как вы собираетесь использовать его и т. Д.

На данный момент это должно быть то, что вы хотите сделать.

#edit - 1

Вы также можете передать Form1 как переменная для ваших Adder класса, если вы не хотите его статическим или передать его методу Add.

Пример 1

public class Adder 
{ 
    private Form1 _form1; 

    public Adder(Form1 form1) 
    { 
     _form1 = form1; 
    } 

    public void Add() 
    { 
     _form1.AddValue("sfdg"); 
    } 
} 

Пример 2

public class Adder 
{ 
    public void Add(Form1 form1) 
    { 
     _form1.AddValue("sfdg"); 
    } 
} 

Я бы сказал Использовать Пример 1, если вы собираетесь использовать более form1 чем в одном месте в пределах Adder, в противном случае перейдите к Пример 2.

#edit - 2

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

private void button2_Click(object sender, EventArgs e) // here it "starts" 
{ 
    Adder adder_objet = new Adder(); 
    adder_objet.Add(); 
} 

С

private void button2_Click(object sender, EventArgs e) // here it "starts" 
{ 
    Adder adder_objet = new Adder(); 
    adder_objet.Add(this); 
} 

И

public class Adder 
{ 

    public void Add(Form1 form1_object) 
    { 
     form1_objet.AddValue("sfdg"); 
    } 

} 
+0

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

+0

Если вы читаете то, что я сказал «Конечно, некоторые из вышеперечисленных вопросов зависят от того, как вы собираетесь использовать его и т. Д.». Как было бы бессмысленно объяснять дальше, если это необходимо.Однако это помогает в большинстве случаев, когда вы хотите делиться формами между другими формами и/или классами (которые формально являются формами). – Bauss

Смежные вопросы