2014-01-15 60 views
0

我对c#相当新,并且出现错误“对象引用未设置为对象实例”。我正在创建一个XML数据包并将其发送到外部设备进行控制。如果我将下面的代码放在窗体中的点击事件中,它的效果非常好。 在BTN Click事件,它看起来像这样:变量作用域c#

 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写入的方法关闭文件的形式记载:构建stringRequestXml当发生

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); 

该错误。

我的问题的一部分是PopulateTestData()是窗体本身的方法。它的目的是从txtboxes和cmbboxes获取数据,然后将它们分配到各自的论点..

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()方法:

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; 
     } 
    }     

Iknow我在这里遇到变量的问题。在我调用setTestData()方法之前,仍然必须在表单上使用PopulateTestDataXml方法。但是当我调用方法时,我必须声明testInfo = null或者SetTestInformation的参数无效(“在当前上下文中不存在”)。我需要传递什么信息,以及如何使其作为窗体btn click上的调用方法工作?我需要这样做,因为我有很多反序列化函数也写在响应xml中的错误消息(这些都可以正常工作)以及它在click事件上的太多信息。 (我需要学习)。

谢谢

回答

1

你们的例子都不应该工作(不管你把它们放在哪里)。这简直是​​不正确的:

TestInformation testInfo = null; 
// ... 
stringRequestXML = XMLCommunicationPackets.SetTestInformation (testInfo, 
               testInfo.TestID, ...); 
//              ^^ BANG! 

testInfo对象null。当您尝试访问任何东西对象null对象..一个NullReferenceException被引发。你需要先初始化它。你正在试图在你的PopulateTestDataXml方法中做到这一点。所以,你的代码改成这样:

TestInformation testInfo = PopulateTestDataXml(); // assign it 
0

这是你的问题..

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); 

你分配这些对象我看到他们只是声明,但从未赋值。

SetTestInfoResponse testDataDs = null; 
    TestInformation testInfo = null; 
+0

谢谢你,你是对的。我没有将值传递给SetTestData – willkk

0

我没有看到你使用空对象,所以我怀疑,如果您以后将它们设置,也ü说,在

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文件中,例如:

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

,并同时更换(新表()),与(F)的调用方法, 你我的课是这样的:

class MyClass{ 
    public static Form1 staticFormPointer = null; 
    //your code 
    . 
    . 
    . 
// and in your methods you call it like this txtBox1.Text -> staticFormPointer.txtBox1.Text 
}