2012-06-26 2 views
1

다음 디자인을위한 지침이 필요합니다.40 개 이상의 제어 값을 추적하십시오

다양한 그룹 상자가 포함 된 탭 컨트롤이 있습니다. 그룹 상자에는 해당 그룹 상자와 관련된 특정 컨트롤이 있습니다. 예를 들어 변경이 그룹 상자의 모든 컨트롤을 만들어 지금 때마다

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

당신의 컨트롤 텍스트 나 값 속성을 결합해야합니다 매뉴얼을 작성하는 것보다 당신의 ConfigurationValues ​​클래스 deserialise 직렬화를하고 XML을 xml로 수 귀하의 ConfigurationValues ​​클래스의 속성 예 당신의 양식의 btnSave_Click()에

ConfigurationValues cv = Repository.ReadConfigValues(); 

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

// Add the rest of your control bindings here 

, 폼의 현재 편집을 종료하고 (당신이로드하는 방법이 필요합니다 저장소 클래스의 설정이 값

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

저장) 및 저장() 자료. 여기에 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()); 
    } 
} 
+0

Mangist에게 문의 해 주셔서 감사합니다. XML을 사용하여 구성 설정을 저장하고로드 할 수 있다는 것을 알게 된 후 해당 메서드를 사용하여 컨트롤을로드하려고합니다. DataBinding에 대해 읽었을 때 순간적으로 혼란 스럽습니다. – brazc0re

+1

DataBinding을 사용하면 ConfigurationValues ​​속성을 읽고 컨트롤의 Text 속성을 수동으로 설정하는 것보다 훨씬 쉽고 읽기 쉽습니다. 데이터를 저장하려면 ConfigurationValues ​​개체로 다시 읽어야합니다. 바인딩을 사용하면이 모든 것이 프레임 워크에 의해 자동으로 처리됩니다. 행운을 빕니다! – Mangist

+0

Mangist, 당신이 작성한 DataBinding 예제를 실험 한 후에, 이것이 제가가는 최선의 방법입니다. 앞서 언급했듯이 바인딩 프레임 워크는 훨씬 쉽게 읽을 때 "텍스트"값을 채 웁니다. – brazc0re

3

당신은 오히려 "파일을 생성"및 "읽기 파일"방법

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

+0

이 경우 MVVM 패턴이 도움이됩니다. 모델의 모든 데이터를 가지고 XML Serialiseable로 만듭니다.그리고 UI (보기)를 모델에 바인딩하면 갈 수 있습니다. – Soundararajan

+0

생성 된 파일은 XML 형식이 아닙니다. 그러나 구성 파일을 XML 형식으로 저장하기 위해 XML을 직렬화하고 컨트롤을로드하기 위해 XML 파일을 읽는 대신 XML을 사용합니다. – brazc0re

관련 문제