从组合框中的选定项目填充文本框

时间:2013-12-31 16:28:57

标签: c# xml winforms list combobox

我在现有实用程序中添加了一个新接口,用于读取存储在外部设备上的数据。这需要获取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#相当新,谷歌今天不是我的朋友,有什么建议吗?

1 个答案:

答案 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;
}

我已将变量添加到类级别范围,并删除了第一个函数中的声明。现在第一个函数设置类级别值,第二个函数读取类级别值。当然,这做了一些假设:

  • 除非第一个函数在其之前成功运行,否则第二个函数将永远不会运行。
  • 其他处理程序也没有修改该值。

如果存在这些假设不正确的情况,您可能希望添加一些错误检查和异常处理。