2014-01-15 64 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 
}