2014-01-15 3 views
0

Я довольно новичок в C# и получаю сообщение об ошибке «Ссылка на объект не установлена ​​в экземпляр объекта». Я создаю XML-пакет и отправляю его на внешнее устройство для управления. Если я поставлю следующий код в форме в событии клика, он прекрасно работает. На БТН Нажмите событие выглядит следующим образом:Переменная scoping 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 файл, он читает:

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.

Часть моей проблемы - PopulationTestData() - это метод в самой форме. Его цель состоит в том, чтобы принимать данные от 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 Я нахожусь здесь возникают проблемы с переменной областью. Мне еще нужно использовать метод PopulateTestDataXml в форме, прежде чем я вызову метод setTestData(). Но когда я вызываю метод, я должен объявить testInfo = null или параметры SetTestInformation недействительны («Не существует в текущем контексте»). Что мне нужно было бы передать и как для этого работать как вызываемый метод в форме btn click? Мне нужно сделать это, так как у меня есть много десериализующих функций, написанных так же, чтобы поймать сообщения об ошибках в ответе xml (все они работают отлично) и его слишком много информации о событии click. (И мне нужно учиться).

Благодаря

ответ

1

Ни один из ваших примеров должны работать (независимо от того, где вы их). Это просто неверно:

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

Ваш testInfo объект null. При попытке доступа ничего на null объект .. a 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; 

} 

после перемещения его из формы, что означает, что ссылки на текстовые поля нарушены ... , так что вы можете сделать, это хранить указатель, как в вашей программе.cs, где вы вызываете свою форму для отображения, вы можете создать статический объект формы, а затем поместить его в свой класс, а затем установить в файле program.cs, например:

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

, а также заменить (новую форму()), с (е) о вызывающем методе, ваших мой класс, как это:

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