2016-07-21 4 views
2

私はウィンドウフォームを持っています。ユーザーがチェックボックスを選択しないと、新しいフォームが後で[次へ]を押したときに開きますが、選択した場合は同じフォームが使用されます。
チェックボックスを選択した場合、現在のフォームのクローンを(同じ変数とコントロール値で)表示します。チェックボックスをオフにしないで値を変更し、もう一度[次へ]を押して別の値を入力することができます手動で

Form duplicate = this;は同じフォームを参照するだけで、new(this)というようなものはありません。
私のフォームは、以前のフォームからコンストラクタを取得するので、Form duplicate = new Form() = thisを試すことができませんでした

これを行う方法を知っている人はいますか?事前に感謝しますC言語でコントロールと変数の状態をフォームから別のフォームにコピーします。

+2

クローンする必要がある多くの状態変数がありますか?フォーム全体の階層構造(コントロールと子どもたちとイベントはすべて途中で)をクローンすることは私にとって大きな混乱のように思えます。私はそれをしないことをお勧めします。状態のクローンを作成する5〜10個のコントロールがある場合は、これらの特定のコントロール用のメソッドを使用することをお勧めします。 – user3185569

+1

どのメソッドクローンがその値で制御するのですか(私は '.text'値のみをコピーしたい) –

+1

そして、例えば' CheckBoxes'がチェックされていますか? – user3185569

答えて

1

あなたは、フォーム内のこれらのメソッドを追加することができます。

public void RestoreState(Dictionary<string, object> controlStates, 
         Dictionary<string, object> membersStates) 
{ 
    InternalRestoreControls(controlStates); 
    InternalRestoreMembers(membersStates); 
} 

private void InternalRestoreControls(Dictionary<string, object> states) 
{ 
    foreach (var state in states) 
    { 
     Control c = this.Controls.Find(state.Key, true).FirstOrDefault(); 

     if (c is TextBox) 
     { 
      (c as TextBox).Text = state.Value == null ? null : state.Value.ToString(); 
     } 
     else if (c is CheckBox) 
     { 
      (c as CheckBox).Checked = Convert.ToBoolean(state.Value); 
     } 
    } 
} 

private void InternalRestoreMembers(Dictionary<string, object> membersStates) 
{ 
    // you might need to tweek this a little bit based on public/instance/static/private 
    // but this is not the point of your question 

    BindingFlags flags = BindingFlags.Instance | BindingFlags.Static 
         | BindingFlags.Public | BindingFlags.NonPublic; 

    var props = this.GetType().GetProperties(flags); 
    var fields = this.GetType().GetFields(flags); 

    foreach(var variable in membersStates) 
    { 
     var prop = props.FirstOrDefault(x => x.Name == variable.Key); 

     if(prop != null) 
     { 
      prop.SetValue(this, variable.Value); 
      continue; 
     } 

     var field = fields.FirstOrDefault(x => x.Name == variable.Key); 

     if(field != null) 
     { 
      field.SetValue(this, variable.Value); 
      continue; 
     } 
    } 
} 

private Dictionary<string, object> GetControlsState() 
{ 
    return new Dictionary<string, object>() 
    { 
     { txtBox1.Name, txtBox1.Text }, 
     // continue to the rest 
    }; 
} 

private Dictionary<string, object> GetMembersState() 
{ 
    return new Dictionary<string, object>() 
    { 
     { nameof(variable1), variable1 }, 
     // continue to the rest 
    }; 
} 

Uセージ:

Form duplicate = new Form(); 
duplicate.RestoreState(this.GetControlsState(), this.GetMembersState()); 
1

ここに私は何をしますか: "クローン"をボタンで開こうとふりましょう。

public Form1() 
    { 
     InitializeComponent(); 
    } 

    public Form1(string YourValue, int AnotherValue)  //This basically works like a constructor when the form is called 
    { 
     InitializeComponent(); 
     ValueLabel1.Text = YourValue; 
     ValueLabel2.Text = Convert.ToString(AnotherValue); 
    } 

    private void DuplicateButton_Click(object sender, EventArgs e) 
    { 
     int a = 3; 
     Form1 Window = new Form1(TextBox1.Text, a); 
     Window.Show; 
    } 

私はあなたが

+1

15個のテキストボックスのようなものがあります。すでに別の目的のためにコンストラクタを持っています –

+1

もう少し複雑ですが、 'TextBox1'''TextBox2'などのプロパティでオブジェクトをコードすることができますそれらに価値を与えてください。その後、xmlとして保存し、showを使用してフォームを再度呼び出すと、xmlファイルを読み込み、各TextBoxの値を割り当てます。 – Shmosi

0

あなたがキーと値として制御値として制御名と辞書を使用して、オプションのパラメータ

public form1(string para1, int para2, Dictionary<string,object>yourDic=null) 
{ 

} 
としてそれを渡すことができ、この作品を願って:クローニングする形で
+1

手動で辞書を作成しますか? –

+0

はいコントロール名とテキストまたはboolのような値を辞書に保存します。フォームをロードすると、辞書がnullかどうかを確認できます。ヌルでない場合は、 。 – Johannes

関連する問題