2010-03-25 2 views
2

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

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

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

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

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, код компилируется отлично, но ничего не будет отображаться в спискеBox. Как мне это сделать? Я не могу просто ставить TextToBox(). Я знаю, что должен создать ссылку на объект, но не могу понять, как ссылаться на ORIGINAL MainForm, тот, который был создан в методе Main. Спасибо заранее ...

ответ

2

Это будет работать, но только тогда, когда у вас есть один instans из 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"); 
    } 
} 

+0

Спасибо, Jens :) –

+0

Приветствую вас. –

1

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

/* 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

Остин, спасибо за быстрый ответ. К сожалению, textToBox («Hello!»); Строка генерирует исключение ссылочной ссылки. Помогло бы мне, если бы я разместил все примеры кода? Еще раз спасибо. –

+0

@Andrew A: Вы устанавливаете его так, как я делаю в конструкторе примера? –

+0

Остин, да, я точно следовал твоему примеру. Я попробовал инструкцию textToBox в другом методе, и на этот раз он скомпилировал ok, но строка не попала в списокBox ... –

0

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

+0

Джейсон, как вы используете статические методы в сочетании с нестационарными элементами, такими как listBox? Кроме того, я попытался добавить «using ClassName»; наверху, а другой - с помощью директив, но это добавляет ошибки. –

+0

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

+0

Singleton - это шаблон проектирования, который используется для ограничения экземпляра класса для одного экземпляра или объекта.Его не «код». Это способ сделать что-то. Статические методы - это методы, которые можно вызывать без необходимости вручную создавать экземпляр класса. Его также не напрямую «код». Дизайн шаблонов не является кодом, поэтому найдите слова, прежде чем требовать код, чтобы подчеркнуть простые точки. Я знаю, что вы знаете это, прочитав некоторые из ваших других ответов на темы. –

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