1

我有一个 winform 应用程序,它在运行时填充了它的许多 dropdomn 字段框架维护表。每个表单都有一个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 | 物品描述 | 订单号 | 活跃|

我不知道为什么它会在一个地方而不是另一个地方工作。如果我注释掉违规表单中的 Columns[] 部分,它会返回正确的数据,没有错误,但当然所有列都可见。

想法?谢谢!

编辑 1

基于一些评论和关注:错误出现在尝试访问 Columns[] 的第一行。违规表格上可能出现的任何位置和任何列。如果我调试并查看 myDataTable 它会显示正确的列和正确的数据。

4

5 回答 5

3

错误发生在“lkuReleaseInfoUpdateAnnually”还是“lkuMinContactSchedule”上?究竟是哪个控件?似乎错误在事物的控制方面,似乎您在第二种形式中的控件没有您期望它拥有的所有列。

编辑:您似乎将 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() 的调用(它包含在第二组中)。会是这样吗?

于 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 回答