【问题标题】:Variable scoping c#变量作用域c#
【发布时间】:2014-01-15 23:31:05
【问题描述】:

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

        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时出现错误。

我的部分问题是 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;
        }
    }                

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

谢谢

【问题讨论】:

    标签: c# xml methods parameters


    【解决方案1】:

    您的任何示例都不应该工作(无论您将它们放在哪里)。这是完全不正确的:

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

    您的testInfo 对象是null。当您尝试访问 null 对象上的 anything 时,会抛出 NullReferenceException。你需要先初始化它。您正在尝试在您的 PopulateTestDataXml 方法中执行此操作。它会返回您之后的对象。所以把你的代码改成这样:

    TestInformation testInfo = PopulateTestDataXml(); // assign it
    

    【讨论】:

      【解决方案2】:

      这是你的问题..

      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;
      

      【讨论】:

      • 谢谢,你是对的。我没有将值传递给 SetTestData
      【解决方案3】:

      我没有看到你使用空对象,所以我想知道你是否稍后设置它们,你也说错误发生在

      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) 替换 (new Form()), 你我的课是这样的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 2012-05-02
        • 2016-04-19
        • 2014-01-15
        • 2018-01-20
        • 2011-01-11
        相关资源
        最近更新 更多