Передача данных в нестатический listBox путем вызова функции из другого класса - PullRequest
2 голосов
/ 25 марта 2010

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

Вот мой основной метод, довольно стандартный:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
}

Вот функция, которая находится в моем файле MainForm.cs, который я могу очень хорошо вызвать из этого файла класса (через 'TextToBox (myString);'):

public partial class MainForm : Form
{
    ...
    // Function to output results to main Listbox window        
    public void TextToBox(string aString)
    {            
        // Place messages in Main Display list box window
        this.listBox1.Items.Insert(0, aString);            
    }
    ...
}

Но моя проблема в том, что я учусь в другом классе и хочу позвонить "TextToBox(myString);". Если я создаю другую ссылку на объект MainForm, код компилируется нормально, но в listBox ничего не отображается. Как мне это сделать? Я не могу просто сделать TextToBox () статическим. Я знаю, что должен создать ссылку на объект, но не могу понять, как ссылаться на ОРИГИНАЛЬНУЮ MainForm, ту, которая была создана в методе Main. Заранее спасибо ...

Ответы [ 3 ]

2 голосов
/ 26 марта 2010

Это будет работать, но только при наличии одного экземпляра MainForm.

public class MainForm : Form
{
    public MainForm()
    {
        Instance = this;
    }

    public static MainForm Instance { get; private set; }

    // Function to output results to main Listbox window        
    public void TextToBox(string aString)
    {
        // Place messages in Main Display list box window
        this.listBox1.Items.Insert(0, aString);
    }

}
public class Other
{
    public void AddTextToListBox()
    {
        MainForm.Instance.TextToBox("Test");
    }
}

... Редактировать ... Альтернатива:

class Program
{
    public static MainForm MainFormInstance;
    [STAThread]
    static void Main(string[] args)
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MainFormInstance = new MainForm();
        Application.Run(MainFormInstance);
    }
}

public class Other
{
    public void AddTextToListBox()
    {
        Program.MainFormInstance.TextToBox("Test");
    }
}

1 голос
/ 25 марта 2010

Я бы просто передал делегата другому классу.

/* this runs (previous code was not guaranteed to run) */
class OtherClass
{
    public delegate void TextToBox(string s);

    TextToBox textToBox;
    int next = 0;

    public OtherClass(TextToBox ttb)
    {
        textToBox = ttb;
    }

    public void SendSomeText()
    {
        textToBox(next.ToString());
        next++;
    }
}

Я предполагаю, что вы будете создавать экземпляр OtherClass из MainForm. Это как вы называете "OtherClass"?

public partial class MainForm : Form
{
    OtherClass otherClass;

    public MainForm()
    {
        /* just two controls -- listBox1 and button1 */
        InitializeComponent();
        otherClass = new OtherClass(this.TextToBox);
    }

    public void TextToBox(string aString)
    {
        listBox1.Items.Add(aString);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        otherClass.SendSomeText();
    }
}

При нажатии кнопки следующее числовое значение добавляется в начало списка. Вам понадобится опубликовать часть своего кода, если вам понадобится дополнительная помощь.

0 голосов
/ 25 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...