非静态字段,方法或属性需要对象引用

时间:2011-05-25 15:16:06

标签: c# .net winforms

我有一个类,我想从组合框和文本框中获取值,但是当我传递该值时,它会显示以下错误:

An object reference is required for the non-static field, method, or property 

这是代码

public class Device1
{
        public int dwMachineNumber = cboMachineNo.SelectedIndex;
        public int dwBaudrate = 9600;
        public int dwCommPort = CboComPort.SelectedIndex;
        public string dwIPAddress = tbIPAdd.Text.Trim();
        public int dwPort = int.Parse(tbPort.Text.Trim());
        public int dwPassWord = int.Parse(tbPwd.Text.Trim());
}

private bool OpenDevice(int flag)
{
    bool result = false;   
    int DEVICE_BUSY = 0;
    Device1 dww = new Device1();
    try{
       result = OpenCommPort(dww.dwMachineNumber,
                       dww.dwBaudrate, 
                       dww.dwCommPort, 
                       dww.dwIPAddress, 
                       dww.dwPassWord,
                       dww.dwPort,
                       flag);

}

3 个答案:

答案 0 :(得分:1)

很难完全回答,因为您的代码示例不完整。但是对这个错误的解释可能有所帮助。

基本上,您尝试静态调用另一个类的方法或属性,但该方法或属性未标记为静态。

看看这个示例,它不会编译并抛出你得到的错误:

public class Class1
{
    public void DoSomething()
    {
    }
}

public class Class2
{
    public Class2()
    {
        Class1.DoSomething();
    }
}

要解决这个问题,我们需要将方法DoSomething设为静态:

public class Class1
{
    public static void DoSomething()
    {
    }
}

public class Class2
{
    public Class2()
    {
        Class1.DoSomething();
    }
}

现在将编译,如果您不希望该方法是静态的另一个选项是在调用它之前创建一个实例:

public class Class1
{
    public void DoSomething()
    {
    }
}

public class Class2
{
    public Class2()
    {
        Class1 myClass1 = new Class1();
        myClass1.DoSomething();
    }
}

如果您的错误发生在该行:

public int dwCommPort = CboComPort.SelectedIndex;

我怀疑你的组合框名称错了,或者intellisense选择了错误的项目而你没有注意到。我注意到你用“cbo”开始组合框的名称,但是这个名字有大写,所以我怀疑这里的名字是错误的。

答案 1 :(得分:0)

我不知道从哪里开始,但第一步是你可能想为你的类创建一个构造函数。类似的东西:

    public class Device1
    {
        public int dwMachineNumber;
        public int dwBaudrate;
        public int dwCommPort;
        public string dwIPAddress;
        public int dwPort;
        public int dwPassWord;

        public Device1(int machineNumber, int baudRate, int commPort, 
            string IPAddress, int port, int password)
        {
            dwMachineNumber = machineNumber;
            dwBaudrate = baudRate;
            dwCommPort = commPort;
            dwIPAddress = IPAddress;
            dwPort = port;
            dwPassWord = password;
        }
    }

现在,在你的winform / webpage中,无论什么操作触发OpenDevice方法被调用都将负责构建Device1对象,然后你可以将它传递给OpenDevice方法。

从winform背后的代码中,您需要添加对象创建。我认为它来自按钮......

protected void OnClick(object sender, EventArgs e)
{
    Device1 dww=new Device1(cboMachineNo.SelectedIndex,
        9600,
        CboComPort.SelectedIndex,
        tbIPAdd.Text.Trim(),
        int.Parse(tbPort.Text.Trim()),
        int.Parse(tbPwd.Text.Trim())
    );
    OpenDevice(flagValue,dww);
}

private bool OpenDevice(int flag, Device1 dww)
{
    bool result = false;

    int DEVICE_BUSY = 0;
    try
    {
        result = OpenCommPort(dww.dwMachineNumber,
            dww.dwBaudrate, dww.dwCommPort, dww.dwIPAddress, dww.dwPassWord,
            dww.dwPort, flag);

    }
}

请注意,您可能在组合框中使用SelectedIndex,而您可能需要Int32.Parse(cboMachineNo.SelectedValue),而另一个组合框则相同。

答案 2 :(得分:0)

在这里,我认为这是你要做的......

您可能希望创建Device1类,如下所示:

public class Device1
{
    public int dwMachineNumber;
    public int dwBaudrate;
    public int dwCommPort;
    public string dwIPAddress;
    public int dwPort;
    public int dwPassWord;

    public Device1(int dwMachineNumber, int dwBaudrate, int dwCommPort, string dwIPAddress, int dwPort, int dwPassWord)
    {
        this.dwMachineNumber = dwMachineNumber;
        this.dwBaudrate = dwBaudrate;
        this.dwCommPort = dwCommPort;
        this.dwIPAddress = dwIPAddress;
        this.dwPort = dwPort;
        this.dwPassWord = dwPassWord;
    }
}

然后在Winforms表单的代码隐藏中,您需要添加类似于此的内容:

    private void btnMyButton_Click(object sender, EventArgs e)
    {
        Device1 myDevice1 = new Device1(cboMachineNo.SelectedIndex, 9600, cboComPort.SelectedIndex, tbIPAdd.Text.Trim(), int.Parse(tbPort.Text.Trim(), int.Parse(tbPwd.Text.Trim());

        // Now do something with your populated Device1 object.
    }

对于此示例,我将代码添加到按钮的事件处理程序中。您需要将其添加到您希望发生的位置。

此代码将获取winform中的值并将它们传递给类。我相信这就是你想要做的。