我已经为现有的实用程序添加了一个新的接口,它将读取存储在外部设备上的数据。这需要获取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文档,以便在运行前测试程序的功能。因此,在“读取方法”按钮事件中,我有以下代码:
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#和谷歌不是我的朋友今天,有什么建议吗?
发布于 2013-12-31 17:54:15
没有太多有意义的信息可供处理,但问题似乎只是变量的范围界定。从本质上说,你这样做:
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;
}我将变量添加到类级作用域,并删除了第一个函数中的声明。现在,第一个函数设置类级值,第二个函数读取类级值.当然,这做了一些假设:
如果存在这些假设不正确的情况,您可能希望添加一些错误检查和异常处理。
https://stackoverflow.com/questions/20860312
复制相似问题