我对c#相当陌生,并且收到了一个错误“对象引用没有设置为对象的实例”。我正在创建一个XML数据包,并将其发送到外部设备进行控制。如果我在单击事件中将下面的代码放在表单上,它就会工作得很好。在btn单击事件上,它看起来如下所示:
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;
}
} 我这里的可变范围有问题。在调用PopulateTestDataXml ()方法之前,我仍然必须在表单上使用setTestData方法。但是,当我调用该方法时,我必须声明testInfo = null,或者SetTestInformation的参数无效(“在当前上下文中不存在”)。我需要传递什么,如何在btn单击表单上作为一个被调用的方法工作?我需要这样做,因为我还编写了大量反序列化函数,以捕获响应xml中的错误消息(这些都很好),而且关于click事件的信息太多了。(我需要学习)。
谢谢
发布于 2014-01-15 23:37:39
你的例子都不应该起作用(不管你把它们放在哪里)。这是完全不正确的:
TestInformation testInfo = null;
// ...
stringRequestXML = XMLCommunicationPackets.SetTestInformation (testInfo,
testInfo.TestID, ...);
// ^^ BANG!您的testInfo对象是null。当您尝试访问null对象上的任何内容时。抛出一个NullReferenceException。您需要先初始化它。你想用你的PopulateTestDataXml方法来做这件事。它返回您之后的对象。因此,将代码更改为:
TestInformation testInfo = PopulateTestDataXml(); // assign it发布于 2014-01-15 23:41:22
这是你的问题.。
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;发布于 2014-01-16 00:11:47
我不认为您使用空对象,所以我想知道您以后是否设置它们,您还说错误发生在
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),您的my类如下所示:
class MyClass{
public static Form1 staticFormPointer = null;
//your code
.
.
.
// and in your methods you call it like this txtBox1.Text -> staticFormPointer.txtBox1.Text
}https://stackoverflow.com/questions/21150499
复制相似问题