bugfix> c# > 投稿

説明できるといいのですが、テキストが異なる言語になるので申し訳ありません。私がやろうとしているのは、2つのウィンドウがあり、1つはメインで、もう1つはcsvファイルの保存用です。私の現在のプログラムでは、チェックボックスをオンにして[OK]ボタンをクリックすると動作しますが、閉じるとチェックボックスはオフになりますが、開いた後はチェックボックスをオンのままにしておく必要があります。私の窓は次のようなものです:

申し訳ありませんが、私のウィンドウは別の言語になっていますが、これは重要ではないと思います

回答 3 件
  • 作業サンプルをアップロードしましたここに 

    説明 :

    すべてのコントロール(チェックボックスなど)のステータスを保持するステータスクラスと、それらが最後に保持していた値を作成できます。

    public class StatusClass
    {
        public bool Chkbox1Checked;
        public bool Chkbox2Checked;
        //same way other required controls status
        // EG. public string Textbox1Tex
    }
    
    

    次に、このクラスオブジェクトをsave csvフォームのコンストラクターに渡します。

    以下のように。

       private StatusClass m_statusClass;
        public FrmSaveCSV(StatusClass statusClass)
        {
            InitializeComponent();
            m_statusClass = statusClass;
        }
    
    

    また、このフォーム(FrmSaveCSV)のLoadイベントとClosingイベントをリッスンする必要があります。ここで、以前のステータスをロードし、現在のステータスを保存できます。以下のように:

       private void FrmSaveCSV_Load(object sender, EventArgs e)
        {
            LoadStaus();
        }
        private void FrmSaveCSV_FormClosing(object sender, FormClosingEventArgs e)
        {
            SaveStatus();
        }
        private void LoadStaus()
        {
            this.Checkbox1.Checked = m_statusClass.Chkbox1Checked;
            this.Checkbox2.Checked = m_statusClass.Chkbox2Checked;
            //same way load other controls
        }
        private void SaveStatus()
        {
            m_statusClass.Chkbox1Checked = this.Checkbox1.Checked;
            m_statusClass.Chkbox2Checked = this.Checkbox2.Checked;
        }
    
    

    さて、

    アプリケーション全体を閉じながら、単に serialize することができます  StatusClassのこのオブジェクト、および de-serialize ソフトウェアの起動時  それを元に戻し、それを使用して FrmSaveCSV のコンストラクタに渡します  。このように、ソフトウェア全体を再起動しても、ステータスの保存は機能します。

    この質問を参照してください:

    シリアル化可能なオブジェクトをファイルに保存/復元する方法は?

    注意: ステータスクラスの新しいオブジェクトを作成していないことを確認し、この新しく作成したオブジェクトを FrmSaveCSV に渡します。  毎回。ステータスクラスのオブジェクトは常に同じでなければなりません。

    これを FrmSaveCSV と呼んでいる場合の意味   Form1 から  このように見えるはずです、

    public partial class Form1 : Form
    {
        //common (single) object of status calss
        StatusClass m_statusClass;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //passing common (single) object of status class in this form 
            FrmSaveCSV frmSaveCSV = new FrmSaveCSV(m_statusClass);
            frmSaveCSV.Show();
        }
        //On software load, we de-serialize last status form file
        private void Form1_Load(object sender, EventArgs e)
        {
            string fileName = "Status.dat";
            if (File.Exists(fileName))
            {
                Stream s = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                IFormatter f1 = new BinaryFormatter();
                try
                {
                    m_statusClass = (StatusClass)f1.Deserialize(s);
                }
                catch
                {
                    s.Close();
                    m_statusClass = new StatusClass();
                }
                s.Close();
            }
            else
                m_statusClass = new StatusClass();
        }
        //Of software closing we serialize current stats in file.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            string fileName = "Status.dat";
            if (File.Exists(fileName))
                File.Delete(fileName);
            using (Stream s = new FileStream("Status.dat", FileMode.Create))
            {
                IFormatter f2 = new BinaryFormatter();
                f2.Serialize(s, m_statusClass);
                s.Close();
                s.Dispose();
            }
        }
    }
    
    

  • とてもシンプルだと思います、 Form1という名前の最初のフォームとForm2という名前の2番目のフォームがあると仮定します。 考えは、チェックされた値をチェックして返すこの関数を使用することです。フォーム2を再び開くと、保存された値に基づいてチェックボックスがチェックまたはチェック解除されます。

    フォーム2で、Modifiers = publicチェックボックスを作成します

    //Form 1
    public bool status;                         // create global string to be accessed in form2
    Form2 fm2 = new Form2();                    // make an instance of form 2
    fm2.stored_status = status;                 // assign the stored value to the getter and setter in form 2
    fm2.ShowDialog();                           // open form2 in dialog style            
    status = fm2.GetStatus(fm2.checkBox1);      //call the function and store
    // Form 2
    public bool stored_status { get; set; } // define getter and setter 
    private void Form2_Load(object sender, EventArgs e) 
    {
        if (stored_status)      // check if stored value equal checked
            checkBox1.Checked = true;           // make the checkbox checked
        else                                    // if not 
            checkBox1.Checked = false;          // keep it unchecked
    }
    public bool GetStatus(CheckBox check) // returns true of false and takes paramter of checkbox
    {
        if (check.Checked)           // check if checkbox1 is checked
             return true;               // return true
        else                                 // if not 
            return false;           // return false
    }
    
    

  • これはそれほど難しくありません。 Form1には1つの Boolean が必要です  グローバル変数 currentCheckState   Form2 の以前の状態を保持する  チェックボックス。作成したら、falseに初期化します。

    Form2  少し調整が必要です。最初に、 Boolean を取得する「コンストラクタ」  チェックボックスを前の状態に設定するには変数が必要です。このアプローチでは、コンストラクタ自体にチェックボックスを設定できます。次に、ユーザーが[保存]ボタンをクリックしてフォームを閉じるときにチェックボックスの状態を保持するために、パブリックな「ブール」変数が必要です。

    一度 Form2  閉じます、 Form1  グローバル currentCheckState を設定できます  新しいチェックボックスの状態になり、プロセスが繰り返されます。以下は、上記の内容の例です。

    Form2

    public partial class Form2 : Form {
      public bool currentState;
      public Form2(bool previousState) {
        InitializeComponent();
        checkBox1.Checked = previousState;
      }
      private void btnSave_Click(object sender, EventArgs e) {
        currentState = checkBox1.Checked;
        this.Close();
      }
    }
    
    

    Form1

    public partial class Form1 : Form {
      private bool currentCheckState = false;
      public Form1() {
        InitializeComponent();
      }
       private void button1_Click(object sender, EventArgs e) {
        Form2 f2 = new Form2(currentCheckState);
        f2.ShowDialog();
        currentCheckState = f2.currentState;
      }
    }
    
    

    これが理にかなっていることを願っています。

あなたの答え