我在现有实用程序中添加了一个新接口,用于读取存储在外部设备上的数据。这需要获取XML响应并将它们反序列化为列表。这是xml和列表创建的代码(复制所有元素,属性,类型声明在这里会过于冗长。):
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Device>
<Response>
<command>Get</command>
<argument>AllMethod</argument>
</Response>
<AllMethod>
<Method>
<nMethodNumber>1</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
<Method>
<nMethodNumber>2</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
<Method>
<nMethodNumber>3</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
<Method>
<nMethodNumber>4</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
<Method>
<nMethodNumber>5</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
<Method>
<nMethodNumber>6</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
<Method>
<nMethodNumber>7</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
<Method>
<nMethodNumber>8</nMethodNumber>
<sMethodName>Method-8</sMethodName>
<fFlowRate>3.00</fFlowRate>
<nTubeTemp>250</nTubeTemp>
<nTestTime>150</nTestTime>
</Method>
</AllMethod>
</Device>
创建列表:
public class AllMethod
{
[XmlElement("Method")]
//Puts Methods into list for deserialization.
public List<Method> methodlist = new List<Method>();
}
我在本地创建了XML文档,以便在上线之前测试程序的功能。所以在我的Read Methods按钮事件中,我有以下代码:
private void btnReadMethod_Click(object sender, System.EventArgs e)
{
string stringRequestXML = string.Empty;
string stringResponseXML = string.Empty;
{
//Will deserialize xml response and populate combo box with method numbers.
//try
//{
XmlSerializer deserializer = new XmlSerializer(typeof(ReadMethodResponse));
StreamReader reader = new StreamReader(@"C:\XML\GetAllXml.xml");
object obj = deserializer.Deserialize(reader);
ReadMethodResponse XmlData = (ReadMethodResponse)obj;
reader.Close();
//}
//catch (Exception ex)
//{
// throw ex;
//}
cmbMethodNumber.Items.Clear();
foreach (Method details in XmlData.allMethods.methodlist)
{
cmbMethodNumber.Items.Add(details.MethodNumber);
}
}
}
private void cmbMethodNumber_SelectedIndexChanged(object sender, EventArgs e)
{
int MethodDetailsIndex = cmbMethodNumber.SelectedIndex;
Method selectedMethod = xmlData.allMethods.methodlist[MethodDetailsIndex];
txtMethodName.Text = selectedMethod.MethodName.ToString();
txtFlow.Text = selectedMethod.FlowRate.ToString();
txtTubeTemp.Text = selectedMethod.TubeTemp.ToString();
txtTestTime.Text = selectedMethod.TestTime.ToString();
}
}
我有一个组合框来显示方法编号和三个文本框来显示方法名称,流速,测试时间和温度。我试图根据组合框的选定值(方法编号)使用正确的信息填充文本框。我反序列化xml的代码运行正常,但是我无法用相应的数据填充文本框。我无法从cmbMethodNumber_SelectedIndexChanged访问该列表。 这可能相当简单,但我对c#相当新,谷歌今天不是我的朋友,有什么建议吗?
答案 0 :(得分:0)
没有太多有意义的信息可以继续,但似乎就像问题只是变量范围一样。基本上,你是这样做的:
private void btnReadMethod_Click(object sender, System.EventArgs e)
{
var xmlData = SomeFunctionToGetData();
}
private void cmbMethodNumber_SelectedIndexChanged(object sender, EventArgs e)
{
var someValue = xmlData.SomeValue;
}
当然,第二个函数中不存在xmlData
,因此无法引用它。它是在第一个函数的范围内声明的,一旦该函数结束,它就从范围中删除了。这与您尝试解决的XML或整体业务问题没有任何关系,它只是一个可变范围错误。
为了让多个处理程序访问此数据(也就是说,为了使数据范围在表单上的多个事件上持续),它需要是一个类级别的对象。更像是这样:
private TheTypeOfTheObject xmlData;
private void btnReadMethod_Click(object sender, System.EventArgs e)
{
xmlData = SomeFunctionToGetData();
}
private void cmbMethodNumber_SelectedIndexChanged(object sender, EventArgs e)
{
var someValue = xmlData.SomeValue;
}
我已将变量添加到类级别范围,并删除了第一个函数中的声明。现在第一个函数设置类级别值,第二个函数读取类级别值。当然,这做了一些假设:
如果存在这些假设不正确的情况,您可能希望添加一些错误检查和异常处理。