0

Windows フォーム プロジェクトの特定のフォームに問題があります。問題があるフォームは 1 つだけです。この問題を抱えていない同じタイプの参照を使用する他のいくつかがあります。

問題は、コード ビハインドを使用してコントロールを変更しても、実際にはフォーム上でコントロールが更新されないことです。データベースから取得した値をコンボ ボックスの Items コレクションに (.Items.Add()メソッドを介して) 追加することから、テキスト ボックスまたはチェック ボックスを有効にするかどうかを設定すること、テキスト ボックスのテキストまたはチェック ボックスのチェック状態を設定することまで、あらゆることを行うことができます。 ...何も機能しません。一部のコントロールの有効なステータスを実際に設定するコードを除いて、すべてのメソッドのすべてのコードをコメントアウトして、知らないうちに何も実行されていないことを確認しましたが、問題は引き続き発生します。

デバッガーが示すように、有効なステータスを変更するコードは確実にヒットし、条件に応じて true または false にかかわらず、Enabled ステータスが正しく設定されます。無効にする必要があるコントロールはまだ編集可能であり、編集可能なように見えます。このコードはもともと、Intellisense を使用してコントロール名を自動的に入力するように記述されているため、コード ビハインドからフォーム上の正しいコントロールへのリンクに問題はありません。また、フォームを大きくして空白のパネルにドロップし、新しいテキストボックスとチェックボックスを付けて、同じ方法でパネルを有効または無効に設定しようとしましたが、実行時にコントロールもありませんでしたコードビハインドによって変更されました。

私が見逃している可能性があるものについて何か提案はありますか? これは Windows フォームの非常に基本的な機能であるため、何が問題なのかわかりません。グーグルまたはこのサイトを検索しても、同様の問題は見つかりませんでした。

ありがとう!

編集:これは、機能するはずのコードサンプルですが、機能していません。同様のコードが他のいくつかのフォームで問題なく使用されています。

chkDisable というチェックボックスがオンになっていると、次のイベントが実行されます。

    private void chkDisable_CheckedChanged(object sender, EventArgs e)
    {
        SetControlsEnabledStatus(!((CheckBox)sender).Checked);
    }

    private void SetControlsEnabledStatus(bool enabledStatus)
    {
        textBox1.Enabled = enabledStatus;
        textBox2.Enabled = enabledStatus;
    }

このイベントが正しく配線され、正しく起動し、テキスト ボックスの Enabled ステータスが正しく設定されていることは 100% 確信しています。これを上書きする可能性のあるコードをアンコメントしたメソッドは他にありません。ただし、チェックボックスをクリックした後にフォームが再度読み込まれるとすぐに、テキストボックスは常に有効になります。

EDIT2:誰かが自分の問題でこれに遭遇した場合、ここに私の問題の原因があります:

最終的にこれを追跡するには、新しいフォームをゼロから作成する必要がありました。コンストラクターと FormLoad イベントの両方で InitializeComponent() の呼び出しがあったことが判明しました。基本的に、Disable イベントのみを実行して、同じコントロールを含む新しいフォームを作成しました。Load コードをコピーすると、Disable が機能しなくなりました。

4

2 に答える 2

1

私は同様の問題を抱えていましたが、フォームに OnShown ハンドラーを追加することで解決しました。これは、他のイベント処理コードを保護するブール値を反転させます。アイデアは、初期化プロセスの何かが、発生させたくない方法でコントロールのイベントを発生させているということです。理想的ではありませんが、少なくともデバッグ手段として試す価値はあります。

于 2012-04-19T20:32:41.370 に答える
1

ソリューションをクリーンアップし、すべてを再構築して開始してみてください。(:

それでもうまくいかない場合は、コードを投稿できますか?

編集:

さて、ここでコードを確認する必要はありません...基本的なアドバイスを提供します。

フォーム全体に MessageBox.Show("実行しました!") を配置し始めます。コンストラクター/初期化イベントに入れます。クリックイベントなどに入れます。どこかで例外を処理していて、フォームを更新するコードが実行される機会がない可能性があります。

明らかに何か問題があります。問題がコードに存在することを除外できるまで、問題があると想定します。コードを投稿すると、それをコピーして独自のプロジェクトに貼り付け、動作を確認できます。それが機能する場合、コードが適切であり、問​​題が別の場所にあることを確認できます。

それが少し役立つことを願っています。(:

編集:

提供されたコードを使用して、サンドボックス プロジェクトを作成しました。

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;

namespace WinFormsSandbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void chkDisable_CheckedChanged(object sender, EventArgs e)
        {
            SetControlsEnabledStatus(!((CheckBox)sender).Checked);
        }

        private void SetControlsEnabledStatus(bool enabledStatus)
        {
            textBox1.Enabled = enabledStatus;
            textBox2.Enabled = enabledStatus;
        }
    }
}

ここに画像の説明を入力

ここに画像の説明を入力

わたしにはできる。投稿したコードにエラーが存在してはなりません。

編集:

問題の根本原因を突き止めることをあきらめたくありませんが、これが時間に敏感な問題である場合は、新しいフォームをゼロから作成して機能をコピーする方が早いかもしれません。(:

于 2012-04-19T19:55:24.487 に答える