テキストボックスの内容が修正されたかを検出する - C#

テキストボックスのテキストがユーザーによって編集されたかを検出するコードを紹介します。

UI

下図のUIを作成します。TextBox, MenuStripを配置します。TextBoxのMultilineプロパティを"True"に設定します。


MenuStripにメニューを追加します。今回は[開く]メニューとしました。


作成したメニュー要素のClickイベントハンドラを作成します。

コード

下記のコードを記述します。フォームのClosingイベントとMenuStripの[開く]ToolStripMenuItemのClickイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;


namespace TextBoxModify
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void ToolStripMenuItem_Open_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
        FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
        StreamReader sr = new StreamReader(fs);
        string doc = sr.ReadToEnd();
        textBox1.Text = doc;
        sr.Close(); 
        fs.Close();
        textBox1.Modified = false;
      }
    }

    private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
    {
      if (textBox1.Modified == true) {
        DialogResult dr = MessageBox.Show(
          "テキストボックスの内容が変更されています。終了してよろしいですか?",
          "確認",
          MessageBoxButtons.YesNo);

        if (dr == System.Windows.Forms.DialogResult.Yes) {
        }
        else {
          e.Cancel = true;
        }
      }
    }
  }
}

解説

ToolStripMenuItem - Clickイベント
private void ToolStripMenuItem_Open_Click(object sender, EventArgs e)
{
  if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
    StreamReader sr = new StreamReader(fs);
    string doc = sr.ReadToEnd();
    textBox1.Text = doc;
    sr.Close(); 
    fs.Close();
    textBox1.Modified = false;
  }
}
OpenFileDialogで選択されたファイルをテキストファイルとして開きます。テキストファイルを開くコードの詳細はこちらの記事を参照してください。
テキストファイルを開き、テキストボックスにテキストファイルの内容を表示します。ModifiedプロパティをFalseに設定し編集が行われていない状態に初期化します。
Form - Closingイベント
private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
  if (textBox1.Modified == true) {
    DialogResult dr = MessageBox.Show(
      "テキストボックスの内容が変更されています。終了してよろしいですか?",
      "確認",
      MessageBoxButtons.YesNo);

    if (dr == System.Windows.Forms.DialogResult.Yes) {
    }
    else {
      e.Cancel = true;
    }
  }
}
テキストボックスのModifiedプロパティを参照します。ModifiedプロパティがTrueである場合はテキストボックスに編集が加えられているため、メッセージボックスを表示します。メッセージボックスの[Yes]ボタンが押されなかった場合はFormClosingEventArgsのCancelプロパティにtrueを代入し、フォームが閉じられるのをキャンセルします。

実行結果

プロジェクトを実行します。実行後すぐにフォームを閉じると何もメッセージが表示されずにアプリケーションが終了します。


テキストボックスに文字を入力し、その後フォームを閉じます。テキストボックスに文字が入力されたため下図の確認のダイアログボックスが表示されます。


続いてメニューの[開く]を選択してテキストファイルを読み込みます。この状態でフォームを閉じると何もメッセージが表示されずにアプリケーションが終了します。


テキストボックスで文字の追加や削除をした後でフォームを閉じると、下図の確認ダイアログボックスが表示されます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2012-06-25
iPentec all rights reserverd.