【问题标题】:using method from form1 to form2使用从form1到form2的方法
【发布时间】:2014-06-04 10:02:46
【问题描述】:

我在使用从 form2 到 form1 的方法时遇到问题。错误是“对象引用未设置为对象的实例”。而且我无法弄清楚我做错了什么。我还是表单编程的初学者,而且我很难过。

这是我在 form1 中的代码:

    // showing form2 and pass the value of the _handle
    private void sendMessageToolStripMenuItem_Click(object sender, EventArgs e)
    {
        foreach (ListViewItem item in listView1.SelectedItems)
        {
            int _handle = (int)item.Tag;
            sf = new SendForm(_handle);
            sf.Show();
        } 
    }

    // sending message using socket
    public void sendT(int _handle, string msg)
    {
        byte[] sdata = Encoding.ASCII.GetBytes(msg);
        serverSocket[_handle].Send(sdata, 0, sdata.Length, 0);
    }

这是我的 form2 代码:

    Main m = new Main();
    int handle;

    public SendForm(int handle)
    {
        InitializeComponent();
        this.handle = handle;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        m.sendT(handle, "msgbox||test message||warning");
    }

我不知道如何解决这个问题。

【问题讨论】:

  • 哪一行会报错?该错误意味着某些东西在运行时具有 null 值,并且您的代码假定它具有有效值。
  • 我认为你没有设置句柄任何值
  • SendForm 需要了解您的主要表单,目前不需要。

标签: c# winforms


【解决方案1】:

我可以看到您正在尝试在 Main 的新实例上执行方法 sendT,所以您可能需要像这样修改

form1 中的颂歌:

// showing form2 and pass the value of the _handle
private void sendMessageToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (ListViewItem item in listView1.SelectedItems)
    {
        int _handle = (int)item.Tag;
        sf = new SendForm(_handle, this);
        sf.Show();
    } 
}

// sending message using socket
public void sendT(int _handle, string msg)
{
    byte[] sdata = Encoding.ASCII.GetBytes(msg);
    serverSocket[_handle].Send(sdata, 0, sdata.Length, 0);
}

form2代码:

Main m;
int handle;

public SendForm(int handle, Main mainForm)
{
    InitializeComponent();
    this.handle = handle;
    this.m=mainForm;
}

private void button1_Click(object sender, EventArgs e)
{
    m.sendT(handle, "msgbox||test message||warning");
}

这将解决我所看到的问题

【讨论】:

  • 谢谢。这解决了我的问题。我正在创建 main 的新实例,这就是为什么我有一个空值。谢谢
【解决方案2】:

serverSocket 似乎没有初始化。恕我直言,我建议使用单独的类来执行应用程序中屏幕常见的操作。

在给出代码示例的情况下,我认为表单之间没有真正需要交互,因此不需要发送表单实例。

【讨论】:

    【解决方案3】:

    这就是问题所在:Main m = new Main(); 这个 m 只是 Main 类的一个新实例,与显示 SendForm 实例的第一个表单无关。稍后您正在调用此实例的 sendT 方法,该方法可能正在使用一些仍然为空的东西。解决这个问题,我认为它会正常工作。

    private Main m;
    private int handle;
    
    public SendForm(Main mform, int handle)
    {
        InitializeComponent();
        m = mform;
        handle = handle;
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        _form.sendT(handle, "msgbox||test message||warning");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多