1

実行時にメンテナンス テーブルから多くの dropdomn フィールドを埋める winform アプリがあります。各フォームには、あるフォームで列の可視性の設定が機能するが、別のフォームではインデックスが範囲外のPrivate void FillMaintFields()エラー になるという奇妙なエラーが発生しました!

問題のあるフォームの要約されたメソッドは次のとおりです-->

 private void FillMaintFields()
{
    var myMCPTableMaint = new TableMaint();
    // Index 27 is Diabetic Teaching Topics
    var myDataSet = myMCPTableMaint.GetMaintItem(27);
    var myDataTable = myDataSet.Tables[0];
    // Diabetic TeachingTopics dropdown
    chkcboDiabeticTeachingTopics.Properties.DataSource = myDataTable;
    chkcboDiabeticTeachingTopics.Properties.DisplayMember = "ItemDescription";
    chkcboDiabeticTeachingTopics.Properties.ValueMember = "ItemID";
    // Index 26 is Diabetic Teaching
    myDataSet = myMCPTableMaint.GetMaintItem(26);
    myDataTable = myDataSet.Tables[0];
    lkuDiabeticTeaching.Properties.DataSource = myDataTable;
    lkuDiabeticTeaching.Properties.PopulateColumns();
    lkuDiabeticTeaching.Properties.DisplayMember = "ItemDescription";
    lkuDiabeticTeaching.Properties.ValueMember = "ItemID";
    lkuDiabeticTeaching.Properties.Columns[0].Visible = false;
    lkuDiabeticTeaching.Properties.Columns[1].Visible = false;
    lkuDiabeticTeaching.Properties.Columns[3].Visible = false;
    lkuDiabeticTeaching.Properties.Columns[4].Visible = false;
}

これが姉妹フォームの作業関数です -->

        private void FillMaintFields()
    {
        var myMCPTableMaint = new TableMaint();
        // Index 4 is Minimum Contact Schedule
        var myDataSet = myMCPTableMaint.GetMaintItem(4);
        var myDataTable = myDataSet.Tables[0];
        lkuMinContactSchedule.Properties.DataSource = myDataTable;
        lkuMinContactSchedule.Properties.PopulateColumns();
        lkuMinContactSchedule.Properties.DisplayMember = "ItemDescription";
        lkuMinContactSchedule.Properties.ValueMember = "ItemID";
        lkuMinContactSchedule.Properties.Columns[0].Visible = false;
        lkuMinContactSchedule.Properties.Columns[1].Visible = false;
        lkuMinContactSchedule.Properties.Columns[3].Visible = false;
        lkuMinContactSchedule.Properties.Columns[4].Visible = false;

        // Index 5 is Release of Information Updated Annually
        myDataSet = myMCPTableMaint.GetMaintItem(5);
        myDataTable = myDataSet.Tables[0];
        lkuReleaseInfoUpdateAnnually.Properties.DataSource = myDataTable;
        lkuReleaseInfoUpdateAnnually.Properties.PopulateColumns();
        lkuReleaseInfoUpdateAnnually.Properties.DisplayMember = "ItemDescription";
        lkuReleaseInfoUpdateAnnually.Properties.ValueMember = "ItemID";
        lkuReleaseInfoUpdateAnnually.Properties.Columns[0].Visible = false;
        lkuReleaseInfoUpdateAnnually.Properties.Columns[1].Visible = false;
        lkuReleaseInfoUpdateAnnually.Properties.Columns[3].Visible = false;
        lkuReleaseInfoUpdateAnnually.Properties.Columns[4].Visible = false;}

それらはすべてDALで同じメソッドを使用しており、->の構造を持つまったく同じテーブルにアクセスしています


|アイテムID | カテゴリ ID | 商品説明 | オーダーID | アクティブ|

なぜある場所では機能し、別の場所では機能しないのか、私はここで途方に暮れています. 問題のあるフォームの Columns[] 部分をコメントアウトすると、エラーなしで正しいデータが返されますが、もちろんすべての列が表示されます。

アイデア?ありがとう!

編集1

いくつかのコメントと懸念に基づいて: エラーは、Columns[] にアクセスしようとする最初の行に表示されます。問題のあるフォームのどこにでも、どのような列であっても。デバッグして myDataTable を見ると、正しい columnms と正しいデータが表示されます。

4

5 に答える 5

3

「lkuReleaseInfoUpdateAnnually」または「lkuMinContactSchedule」でエラーが発生していますか?それは正確にどのコントロールですか?エラーはコントロール側にあるようです。2番目の形式のコントロールには、期待するすべての列が含まれていないようです。

編集:dataTableの列とコントロールの列を混同しているようです。使用しているコントロールはわかりませんが、次のことを行っています。

lkuReleaseInfoUpdateAnnually.Properties.Columns[0]

DataTableにインデックスを作成しているという意味ではありません。コントロールの列にインデックスを付けていますが、そこにある場合とない場合があります。

于 2009-05-28T13:58:28.910 に答える
1

それでも問題を再現する最小限のコードを作成します。そのコードをデバッグします。または、それでも問題が解決しない場合は、ここに投稿してください。上記のコードは実際には何も教えてくれません。大きすぎて、問題に固有のものです。データがどのように表示されるかはわかりません。C#は一致していないようですが、テーブル構造についてはあなたの言葉を借りる必要があります。

全体として、誰もが提供できる支援は、あいまいな当て推量にすぎません。

于 2009-05-28T13:58:08.223 に答える
1

バグとその原因をより適切に特定する方法について、いくつかのアイデアがあります。「lkuDiabeticTeaching.Properties.Columns.Count」の値を監視する必要があります。これが1未満の場合は、列がないことを意味します。おそらく、人口が発生しなかったためです。

于 2009-05-28T13:59:31.483 に答える
0

私が見ることができる唯一のことは、コードの最初のセットにPopulateForms()への呼び出しがないことです(これは2番目のセットに含まれています)。それでいいの?

于 2009-05-28T14:00:29.890 に答える
0

さて、私はそれを理解しました。ちょっと。何らかの理由lkuDiabeticTeaching.Properties.ForceInitialize();で、問題のあるフォームにデータ ソースを設定した後に呼び出す必要があります。

コントロールが初期化される前に何らかの形でこれが起動しようとしていたネストされたフォームがあるため、私はそれを推測することしかできません。

現在はこんな感じです -->

            // Index 26 is Diabetic Teaching
        harDataSet = myHARTableMaint.GetMaintItem(26);
        harDataTable = harDataSet.Tables[0];
        lkuDiabeticTeaching.Properties.DataSource = harDataTable;
        lkuDiabeticTeaching.Properties.ForceInitialize();
        lkuDiabeticTeaching.Properties.PopulateColumns();
        lkuDiabeticTeaching.Properties.DisplayMember = "ItemDescription";
        lkuDiabeticTeaching.Properties.ValueMember = "ItemID";
        if(lkuDiabeticTeaching.Properties.Columns.Count > 0)
        {
            lkuDiabeticTeaching.Properties.Columns[0].Visible = false;
            lkuDiabeticTeaching.Properties.Columns[1].Visible = false;
            lkuDiabeticTeaching.Properties.Columns[3].Visible = false;
            lkuDiabeticTeaching.Properties.Columns[4].Visible = false; 
        }

時間を割いてくれたすべての人に感謝します。

于 2009-05-28T16:19:08.423 に答える