[英]Variable scoping c#
我對C#相當陌生,並且收到錯誤消息“對象引用未設置為對象的實例”。 我正在創建XML數據包,並將其發送到外部設備進行控制。 如果我將以下代碼放在click事件中的表單上,則效果很好。 在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中的錯誤消息(這些都工作正常),以及有關click事件的太多信息。 (我需要學習)。
謝謝
您的兩個示例都不起作用(無論放置在何處)。 這是完全不正確的:
TestInformation testInfo = null;
// ...
stringRequestXML = XMLCommunicationPackets.SetTestInformation (testInfo,
testInfo.TestID, ...);
// ^^ BANG!
您的testInfo
對象為null
。 當您嘗試訪問null
對象上的任何內容時 ,都會引發NullReferenceException
。 您需要先對其進行初始化。 您正在嘗試在PopulateTestDataXml
方法中執行此操作。該方法將返回您的對象。 因此,將您的代碼更改為此:
TestInformation testInfo = PopulateTestDataXml(); // assign it
這是你的問題。
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;
我看不到您使用空對象,所以我想知道您是否稍后再設置它們,您還說錯誤發生在
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()),您的my類如下所示:
class MyClass{
public static Form1 staticFormPointer = null;
//your code
.
.
.
// and in your methods you call it like this txtBox1.Text -> staticFormPointer.txtBox1.Text
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.