2

私はC#で書いているWinformアプリを持っています。私のフォームには、それぞれが要素(主にTextBoxesとDropDownLists)でいっぱいの7ページのTabControlがあります。DataReaderを使用していくつかの情報を取得し、DataTableにデータを入力し、要素のDataBindings.Addメソッドを使用して、これらの要素に現在の値を入力します。

ユーザーはこれらの要素にデータを入力し、[保存]を押してから、要素のテキストフィールドを使用してUPDATEクエリのパラメーターを設定できます。例えば:

updateCommand.Parameters.Add("@CustomerName", SqlDbType.VarChar, 100).Value = CustomerName.Text;

私が抱えている問題は、フォームをロードすると、各タブを手動で選択するまで、すべての要素が明らかに空であると見なされることです。したがって、フォームをロードした直後に[保存]を押すと、まだ選択していないTabPagesのすべてのフィールドが、空のデータで更新しようとします(適切ではありません)。各TabPageを選択すると、これらの要素はデータを適切に送信します。とりあえず、(非常に)醜い回避策を考え出しました。データが初めて入力されたときに各TabPageをプログラムで選択しますが、これは受け入れられない長期的な解決策です。

私の質問は、ユーザーがそのTabPageを選択する前に、TabPagesのすべての要素を取得してデータを適切に返すにはどうすればよいですか?

4

4 に答える 4

7

hoは正しいです。TabPageの要素は、そのTabPageが選択されるまで作成されません。フォームの読み込み時に各TabPageを選択するループを追加したところ、正常に機能するようになりました。

foreach (TabPage tp in tabControl1.TabPages)
{
    tp.Show();
}
于 2010-04-20T20:24:28.057 に答える
4

できるかどうかわかりません。以下はMSDNからの引用です。

「TabPageに含まれるコントロールは、タブページが表示されるまで作成されません。また、これらのコントロールのデータバインディングは、タブページが表示されるまでアクティブ化されません。」

ただし、更新コードでコントロールから直接値を取得する代わりに、コントロールにデータを入力するために使用するDataTableを保持できるクラスを作成し、更新コードが呼び出されると、クラスに値とクラスは、コントロールがロードされているかどうかをチェックし、そうでない場合は、代わりにDataTableから値を取得します。

于 2010-04-20T20:08:48.533 に答える
1

問題は、タブが表示されるまでコントロールが作成されないことです。1つの解決策は、次のようにページの読み込み時に実際にコントロールを作成することです。

private static void CreateControls( Control control )
{
    CreateControl( control );
    foreach ( Control subcontrol in control.Controls )
    {
        CreateControl( subcontrol );
    }
}
private static void CreateControl( Control control )
{
    var method = control.GetType().GetMethod( "CreateControl", BindingFlags.Instance | BindingFlags.NonPublic );
    var parameters = method.GetParameters();
    method.Invoke( control, new object[] { true } );
}

次に、フォームのコンストラクターで、次のようにします。

public Form()
{
    CreateControls( this.tabPage1 );
}

このソリューションは、内部のCreateControlsメソッドが単一のブールパラメーターを取り、それが表示されていない場合でもコントロールを作成できるという事実に依存しています。

于 2010-04-20T20:42:41.083 に答える
0

この問題の回避策は、フォームの読み込みイベントに次のコードを追加することでした。

this.tabcontrol1.BindingContext = this.BindingContext;

于 2015-03-20T17:41:20.020 に答える