0

この質問は、前の質問をさらに発展させたものです。私はC#.NET Framework 2.0、Visual Studios 10を使用しています。テキストエディターがあり、フォームのタイトルにダーティマーカー(この場合は単純な " ")を入れたいと思っています。テキストボックスが変更されている場合は、タイトルに「」が表示されます。テキストボックスが保存されると、「*」が消えます。私は次のことを試しましたが、おそらく間違っています:1つのフォーム、エディター、保存ボタンとテキストボックスがあります

---- Editor.cs

---- Functions.cs

フォームではなく、別のファイルであるFunctions.csが保存時に呼び出され、保存が実行されます(フォームコードのボタンなどを整理するために、別のファイルがダーティな作業を行います)。

--2番目の機能ファイル内からのEditor._isDirty値の変更--エディターファイル自体内からの_isDirty値の変更--エディター内からのIsDirtyの変更(機能ファイルからそれを行う方法がわかりません)

関連するコードは次のとおりです。

    public static bool _isDirty = false;

    public plainTextEditor() 
    {
        InitializeComponent();
        functionsProxy = new Functions();
        IsDirty = false;
    }

    /* Property added to flag Changed _isDirty event */
    public bool IsDirty
    {
        get { return _isDirty; }
        set
        {
            if (_isDirty != value)
            {
                _isDirty = value;
                OnIsDirtyChanged(IsDirty);
            }
        }
    }
    protected void OnIsDirtyChanged(bool _isDirty)
    {
        if (_isDirty == true)
        {
            //textBox1.BackColor = Color.LightCoral;
            this.Text += "*";
        }
        else
        {
            this.Text = "Text Editor";
            //textBox1.BackColor = SystemColors.Window;
        }
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string newtext = textBox1.Text;
        if (currentText != newtext)
        {
            // This solves the problem of initial text being tagged as changed text
            if (currentText == "")
            {
                //textBox1.BackColor = SystemColors.Window;
                IsDirty = false;
            }
            else
            {
                IsDirty = true;
            }
            currentText = newtext;
        }
    }

    private void btnSave_Click(object sender, EventArgs e)
    {
        functionsProxy.doSave(textBox1.Text);
        //_isDirty = false;
        IsDirty = false;
    }

さて、イベントとプロパティについて理解したことから.. _isDirtyの値を変更した場合でも、OnIsDirtyを呼び出して変更する必要がありますか?_isDirtyの値をどこで変更しても、別の形式からのものであると言います。それはとにかく私が欲しいものです.._isDirtyが変更されるかどうかに応じて、*のイベントが表示または非表示になります!どういうわけか、それは汚れをマークするためだけに機能していて、それをクリアするためには機能していません。

可能であれば助けてください、または別の方法を提案してください(サンプルコードはエースです!);)

4

1 に答える 1

0

コードにいくつかの問題があります。それらの 1 つは、メソッド内の静的メンバーとパラメーターの混同です。コードを修正してみました。これがあなたへの私の提案です:

private bool _isDirty = false;

public plainTextEditor() 
{
    InitializeComponent();
    functionsProxy = new Functions();
    IsDirty = false;
}

/* Property added to flag Changed _isDirty event */
public bool IsDirty
{
    get { return _isDirty; }
    set
    {
        if (_isDirty != value)
        {
            _isDirty = value;
            OnIsDirtyChanged();
        }
    }
}

private void OnIsDirtyChanged()
{
    if (_isDirty == true)
    {
        //textBox1.BackColor = Color.LightCoral;
        this.Text += "*";
    }
    else
    {
        this.Text = "Text Editor";
        //textBox1.BackColor = SystemColors.Window;
    }
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string newtext = textBox1.Text;
    if (currentText != newtext)
    {
        // This solves the problem of initial text being tagged as changed text
        if (currentText == "")
        {
            //textBox1.BackColor = SystemColors.Window;
            IsDirty = false;
        }
        else
        {
            IsDirty = true;
        }
        currentText = newtext;
    }
}

private void btnSave_Click(object sender, EventArgs e)
{
    functionsProxy.doSave(textBox1.Text);
    IsDirty = false;
}

「_isDirty」をフォームに非公開にしてください。プロパティ IsDirty で Dirty 状態を既に公開しています。フォーム外のコードで IsDirty を変更したくない場合は、セッター ("set") を非公開にします。これで、コードが実行されるはずです。

于 2013-01-16T09:58:59.673 に答える