首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变作用域c#

可变作用域c#
EN

Stack Overflow用户
提问于 2014-01-15 23:31:05
回答 3查看 101关注 0票数 0

我对c#相当陌生,并且收到了一个错误“对象引用没有设置为对象的实例”。我正在创建一个XML数据包,并将其发送到外部设备进行控制。如果我在单击事件中将下面的代码放在表单上,它就会工作得很好。在btn单击事件上,它看起来如下所示:

代码语言:javascript
复制
        SetTestInfoResponse testDataDs = null;
        TestInformation testInfo = null;
        this.PopulateTestDataXml();
        string stringRequestXML = string.Empty;
        string stringResponseXML = string.Empty;


        //Creates Request packet
        stringRequestXML = XMLCommunicationPackets.SetTestInformation (testInfo, testInfo.TestID, testInfo.TestUser, testInfo.TestSampleType, testInfo.TestSampleId, testInfo.TestMethodNumber, testInfo.TestTubeSn, testInfo.TestComments); 
        //Write set Test Info XML Packet and get response for ack or failure.
        stringResponseXML = PluginContext.GetInstance().InstrumentDriverCurrent.GetInstrumentControl().SetCommonParameter(stringRequestXML);

但是,如果我将整个函数从表单中移出,并试图在单击按钮时调用它,则会得到错误。

在.cs文件中的表单之外的方法中写入它的内容如下:

代码语言:javascript
复制
public static SetTestInfoResponse SetTestData()
    {
        SetTestInfoResponse testDataDs = null;
        TestInformation testInfo = null;

        string stringRequestXML = string.Empty;
        string stringResponseXML = string.Empty;


        //Creates Request packet
        stringRequestXML = XMLCommunicationPackets.SetTestInformation (testInfo, testInfo.TestID, testInfo.TestUser, testInfo.TestSampleType, testInfo.TestSampleId, testInfo.TestMethodNumber, testInfo.TestTubeSn, testInfo.TestComments); 
        //Write set Test Info XML Packet and get response for ack or failure.
        stringResponseXML = PluginContext.GetInstance().InstrumentDriverCurrent.GetInstrumentControl().SetCommonParameter(stringRequestXML);

生成stringRequestXml时发生错误。

我的部分问题是PopulateTestData()是表单本身上的一个方法。它的目的是从txtboxes和cmbboxes中获取数据,并将它们分配给各自的参数。

代码语言:javascript
复制
private TestInformation PopulateTestDataXml()
    {
        TestInformation UiTestData = new TestInformation();
        UiTestData.TestID = txtTestId.Text;
        UiTestData.TestUser = cmbUsers.SelectedItem.ToString();
        UiTestData.TestSampleType = txtSampleType.Text;
        UiTestData.TestSampleId = txtSampleId.Text;
        UiTestData.TestMethodNumber = Convert.ToInt32(cmbMethod.SelectedItem);
        UiTestData.TestTubeSn = txtTubeSerialNum.Text;
        UiTestData.TestComments = txtComments.Text;
        return UiTestData;

    }

下面是获取错误的SetTestInformation()方法:

代码语言:javascript
复制
 public static string SetTestInformation(TestInformation testInfo, string stringTestId, string stringUser, string stringSampleType, string stringSampleId, int intMethodNumber, string stringTubeSn, string stringComments)
    {
        try
        { 
            string stringRequestXMLPacket = string.Empty; 
            string stringType = @"Request";
            string stringCommand = @"Set";
            string stringArgument = @"TestInformation"; 

            CommunicationPacket requestXMLPacket = new CommunicationPacket(stringRootTag, stringXMLVersion, stringType, stringCommand);
            requestXMLPacket.AddCommandArgument(stringArgument);

            requestXMLPacket.AddArgumentItem(stringArgument, "sTestId", testInfo.TestID.ToString());
            requestXMLPacket.AddArgumentItem(stringArgument, "sUser", testInfo.TestUser.ToString());
            requestXMLPacket.AddArgumentItem(stringArgument, "sSampleType", testInfo.TestSampleType.ToString());
            requestXMLPacket.AddArgumentItem(stringArgument, "sSampleId", testInfo.TestSampleId.ToString());
            requestXMLPacket.AddArgumentItem(stringArgument, "nMethodNumber", testInfo.TestMethodNumber.ToString());
            requestXMLPacket.AddArgumentItem(stringArgument, "sTubeSn", testInfo.TestTubeSn.ToString());
            requestXMLPacket.AddArgumentItem(stringArgument, "sComments", testInfo.TestComments.ToString());


            stringRequestXMLPacket = requestXMLPacket.CreateXMLPacket();
            return stringRequestXMLPacket;



        }
        catch (Exception ex)
        {
            throw ex;
        }
    }                

我这里的可变范围有问题。在调用PopulateTestDataXml ()方法之前,我仍然必须在表单上使用setTestData方法。但是,当我调用该方法时,我必须声明testInfo = null,或者SetTestInformation的参数无效(“在当前上下文中不存在”)。我需要传递什么,如何在btn单击表单上作为一个被调用的方法工作?我需要这样做,因为我还编写了大量反序列化函数,以捕获响应xml中的错误消息(这些都很好),而且关于click事件的信息太多了。(我需要学习)。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-15 23:37:39

你的例子都不应该起作用(不管你把它们放在哪里)。这是完全不正确的:

代码语言:javascript
复制
TestInformation testInfo = null;
// ...
stringRequestXML = XMLCommunicationPackets.SetTestInformation (testInfo, 
                                               testInfo.TestID, ...);
//                                                     ^^ BANG!

您的testInfo对象是null。当您尝试访问null对象上的任何内容时。抛出一个NullReferenceException。您需要先初始化它。你想用你的PopulateTestDataXml方法来做这件事。它返回您之后的对象。因此,将代码更改为:

代码语言:javascript
复制
TestInformation testInfo = PopulateTestDataXml(); // assign it
票数 1
EN

Stack Overflow用户

发布于 2014-01-15 23:41:22

这是你的问题.。

代码语言:javascript
复制
public static SetTestInfoResponse SetTestData()
{
    SetTestInfoResponse testDataDs = null;
    TestInformation testInfo = null;

    string stringRequestXML = string.Empty;
    string stringResponseXML = string.Empty;


    //Creates Request packet
    stringRequestXML = XMLCommunicationPackets.SetTestInformation (testInfo, testInfo.TestID, testInfo.TestUser, testInfo.TestSampleType, testInfo.TestSampleId, testInfo.TestMethodNumber, testInfo.TestTubeSn, testInfo.TestComments); 
    //Write set Test Info XML Packet and get response for ack or failure.
    stringResponseXML = PluginContext.GetInstance().InstrumentDriverCurrent.GetInstrumentControl().SetCommonParameter(stringRequestXML);

您是否为这些对象赋值?我看到它们只是声明的,但从未赋值。

代码语言:javascript
复制
  SetTestInfoResponse testDataDs = null;
  TestInformation testInfo = null;
票数 0
EN

Stack Overflow用户

发布于 2014-01-16 00:11:47

我不认为您使用空对象,所以我想知道您以后是否设置它们,您还说错误发生在

代码语言:javascript
复制
private TestInformation PopulateTestDataXml()
{
    TestInformation UiTestData = new TestInformation();
    UiTestData.TestID = txtTestId.Text;
    UiTestData.TestUser = cmbUsers.SelectedItem.ToString();
    UiTestData.TestSampleType = txtSampleType.Text;
    UiTestData.TestSampleId = txtSampleId.Text;
    UiTestData.TestMethodNumber = Convert.ToInt32(cmbMethod.SelectedItem);
    UiTestData.TestTubeSn = txtTubeSerialNum.Text;
    UiTestData.TestComments = txtComments.Text;
    return UiTestData;

}

将其移出窗体后,这可能意味着它的文本框引用被破坏了.所以,您可以做的是存储一个指针,就像在program.cs中调用表单显示一样,您可以创建表单的静态对象,然后将其放入类中,然后将其设置为program.cs文件,如下所示:

Form1 f=new Form();MyClass.staticFormPointer = f;

并且在调用方法上将(新表单())替换为(f),您的my类如下所示:

代码语言:javascript
复制
class MyClass{
    public static Form1 staticFormPointer = null;
    //your code
    . 
    .
    .
// and in your methods you call it like this txtBox1.Text -> staticFormPointer.txtBox1.Text
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21150499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档