通过从另一个类调用函数将数据传递给非静态listBox

时间:2010-03-25 20:37:48

标签: c# winforms class

我有一个简单的表格程序,我一直在与之斗争一段时间。我只是希望能够从不同的类文件中调用一个方法(当在该类文件的代码中触发某个步骤时),以便在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()静态。我知道我必须创建对象引用,但我无法弄清楚如何引用ORFINAL MainForm,这是在Main方法中创建的。提前谢谢......

3 个答案:

答案 0 :(得分:2)

这样可行,但只有当你有一个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 :(得分: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++;
    }
}

我假设您将从MainForm实例化OtherClass。这是你如何称呼“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();
    }
}

在按钮上单击下一个数字值将添加到ListBox的开头。如果您需要进一步的帮助,则必须发布一些代码。

答案 2 :(得分:0)

或者您可以使用单例模式或静态方法,并确保将该类包含在程序顶部的“using”语句中