C#将整个UI控件值保存为XML

时间:2014-07-11 09:49:45

标签: c# user-interface storage

我的C#应用​​程序中有很多控件值。我想知道是否有可能一次存储和读取整个可用的控制值,而不是下面的代码。

请注意,以下代码仅适用于1 groupBox。我有8个,因此这会产生很多代码来实现它(下面代码的8倍)。

  • groupBox是彼此的副本
  • 以下代码
  • 我使用序列化configData类来存储数据(工作)。

    private void uiStateWriteToData()
    {
        configData.datSensor4mA1 = (int)uiSensor4mA1.Value;
        configData.datSensor20mA1 = (int)uiSensor20mA1.Value;
        configData.datSensorPidP1 = (int)uiSensorPidP1.Value;
        configData.datSensorPidI1 = (int)uiSensorPidI1.Value;
        configData.datSensorPidD1 = (int)uiSensorPidD1.Value;
        configData.datSensorPidS1 = (int)uiSensorPidS1.Value;
        configData.datSensor1InToOutput1 = uiSensor1Out1.Enabled;
        configData.datSensor1InToOutput2 = uiSensor1Out2.Enabled;
        configData.datSensor1InToOutput3 = uiSensor1Out3.Enabled;
    }
    
    
    private void uiStateUpdateFromData()
    {
        uiSensor4mA1.Value = configData.datSensor4mA1;
        uiSensor20mA1.Value = configData.datSensor20mA1;
        uiSensorPidP1.Value = configData.datSensorPidP1;
        uiSensorPidI1.Value = configData.datSensorPidI1;
        uiSensorPidD1.Value = configData.datSensorPidD1;
        uiSensorPidS1.Value = configData.datSensorPidS1;
        uiSensor1Out1.Enabled = configData.datSensor1InToOutput1;
        uiSensor1Out2.Enabled = configData.datSensor1InToOutput2;
        uiSensor1Out3.Enabled = configData.datSensor1InToOutput3;
    }
    

1 个答案:

答案 0 :(得分:0)

我不知道是否有任何框架可以做到这一点,但也许您可以提出自己的实用程序,根据控件层次结构,类型和名称将控制值写入xml文件。

以下是它的外观(而非伪代码):

private static void WriteControlValuesToXml(XmlDocument document, XmlNode parentNode, Control currentControl)
{
    // if current control is container, writing its children values

    if (currentControl.Controls.Count > 0)
    {
        var addedNode = AddNode(parentNode, currentControl.Name);
        foreach (Control childControl in currentControl.Controls)
            WriteControlValuesToXml(document, addedNode, childControl);
    }
    else
    {
        // if current control is not container, writing control values

        if (currentControl is CheckBox)
        {
            var checkBox = (CheckBox)control;
            AddNode(parentNode, currentControl.Name, "CheckBox", checkBox.Checked);
        }

        if (currentControl is TextBox)
        {
            var textBox = (TextBox)control;
            AddNode(parentNode, currentControl.Name, "TextBox", textBox.Text);
        }

        // ... other known controls
    }
}

遵循相同的逻辑,您可以实现从文件中读取相同的控制值。