跟踪40多个控制值

时间:2012-06-26 15:40:22

标签: c# winforms

我需要为以下设计提供一些指导。

我有一个包含各种组框的标签控件。在组框内,有与该组框相关的特定控件。例如:

enter image description here

现在,只要对组框中的任何控件进行更改,就需要跟踪控件的值,因为在应用程序运行周期结束时,控件数据需要保存到包含该控件的文件中值。示例文件是:

HOT_STANDBY_FEATURE_ENABLE [val from control here]

HEART_BEAT_DIGITAL_OUTPUT [val from control here] ....

我想到的另一个设计只有在控件上发生ValueChanged事件时组框形式设置的属性。

示例代码:

class ConfigurationValues
{
    public int HotStandbyValue { get; set; }
    public int HeartBeatDigitalOutputValue { get; set; }
    //...add all other controls here
}

我看到的缺点是该标签页上有40个控件,因此我必须手动输入每个属性。当需要在应用程序运行周期结束时生成文件时,我有一个方法可以获得控件需求的值。

示例:

private void GenerateFile()
{
    string[] file = 
    "HOT_STANDBY_FEATURE_ENABLE "  + ConfigurationTabSettings.HotStandbyValue;
}

我需要做的另一个设计考虑是,每当用户点击“打开配置文件”时,需要将来自磁盘文件的值加载到属性中,以便表单可以在启动时获取该数据并使用各自的值填充组框中的控件。

对此设计的任何建议将不胜感激。我知道这不是最有效的方法,而且不是最有经验的程序员,因此我可以搜索的任何Google关键字都会很棒。

2 个答案:

答案 0 :(得分:3)

您可以使用xml serialise和xmlserializer配置值类,而不是编写手动“生成文件”和“读取文件”方法

http://support.microsoft.com/kb/815813

答案 1 :(得分:2)

您需要将控件Text或Value属性绑定到ConfigurationValues类中的属性,例如

ConfigurationValues cv = Repository.ReadConfigValues();

numPulseFilterDelay.DataBindings.Add("Value", cv, "PulseFilterDelay");

// Add the rest of your control bindings here

在表单的btnSave_Click()上,结束表单上的当前编辑并保存配置值

void btnSave_Click(object sender, EventArgs e)
{
    BindingContext[cv].EndCurrentEdit(); // Commits all values to the underlying data source
    Repository.SaveConfigValues(cv);
}

在您的存储库类中,您需要Load()和Save()数据的方法。您可以将XmlSerialization代码放在​​这里,或者编写自己的格式(取决于您的要求)

public class Repository
{
  public static ConfigurationValues LoadConfigValues()
  {
     var cv = new ConfigurationValues();

     string[] lines = File.ReadAllLines("values.cfg");
     foreach (string cfg in lines)
     {
        string[] nameValue = cfg.Split(new char[] { ' ' } ); // To get label/value

        if (nameValue[0] == "HOT_STANDBY_FEATURE_ENABLE")
          cv.HotStandbyFeatureEnable = nameValue[1];
        else if (nameValue[0] == "SOME_OTHER_PROPERTY")
          cv.SomeOtherProperty = nameValue[2];
        // Continue for all properties
     }

     return cv;
  }


  public static void SaveConfigValues(ConfigurationValues cv)
  {
     var builder = new StringBuilder();
     builder.AppendFormat("HOST_STANDBY_FEATURE_ENABLE {0}\r\n", cv.HostStandbyFeatureEnable);
     // Add the rest of your properties

     File.WriteAllText("values.cfg", builder.ToString());
  }
}