【问题标题】:Index out of range error; Here but not There?索引超出范围错误;这里而不是那里?
【发布时间】:2010-10-29 14:07:33
【问题描述】:

我有一个 winform 应用程序,它在运行时填充了它的许多 dropdomn 字段框架维护表。每个表格都有一个Private void FillMaintFields() 我遇到了一个奇怪的错误,其中在一个表单上设置列可见性是可行的,但在另一个表单上却给了我一个 index out of range 错误!

这是冒犯表单上的简化方法 -->

 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 中使用相同的方法并访问具有结构的 EXACT 同一个表 -->


|物品ID |类别ID |物品描述 |订单号 |活跃|

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

想法?谢谢!

编辑 1

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

【问题讨论】:

  • 哇,我的 ANSII 艺术为我的桌子吹了。不知道 BOLD 发生了什么,但你明白了......
  • 有很多行你可以得到这个异常。究竟是哪一行引发了异常?
  • 幻数太多,考虑使用命名常量。您是否仔细调试了执行以隔离未分配列的位置?
  • 我在 offendnig 表单上引用的任何列都会引发错误。此外,如果我调试并查看 myDataTable 它会显示所有列。

标签: c# winforms data-binding controls devexpress


【解决方案1】:

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

编辑:您似乎将 dataTable 中的列与控件上的列混淆了。我不确定您使用的是哪个控件,但正在做:

lkuReleaseInfoUpdateAnnually.Properties.Columns[0]

并不意味着您正在对 DataTable 进行索引。您正在对控件的列进行索引,这些列可能存在也可能不存在。

【讨论】:

  • 是的,我明白你在说什么。我在所有情况下都使用 DevExpress LookUpEdit 控件。看来您也走在了正确的轨道上,因为当我逐步执行代码时,在运行 PopulateColumns() 之前和之后,我在这些控件的违规表单上的列数为 0,而在表单上它适用于列数为 0 然后PopulateColumns() 运行并且列数为 5。我可能不得不将其带到 DevExpress,以了解为什么 PopulateColumns() 在这种情况下没有运行......谢谢!
【解决方案2】:

创建一个仍能重现问题的最小代码。调试该代码;或者,如果这没有帮助,请在此处发布。上面的代码并没有真正告诉我们任何事情:它太大了,对你的问题来说太具体了。我们不知道您的数据看起来如何,我们必须相信您的表结构——尽管 C# 似乎不同意。

总而言之,任何人能提供的任何帮助都只是模糊的猜测。

【讨论】:

  • 我不知道怎样才能让它变得更小?不过,感谢您抽出宝贵时间发帖。
【解决方案3】:

我对如何更好地指定错误及其来源有一些想法。您应该做的事情是观察“lkuDiabeticTeaching.Properties.Columns.Count”值,如果它小于 1 意味着您没有任何列,可能是因为没有发生人口。

【讨论】:

  • 看起来你可能在这里有所了解,但为什么 PopulateColumns() 在一个地方工作而不是另一个地方让我感到困惑....
【解决方案4】:

我唯一能看到的是第一组代码缺少对 PopulateForms() 的调用(它包含在第二组中)。会这样吗?

【讨论】:

    【解决方案5】:

    好吧,我想通了。有点。出于某种原因,在有问题的表单上设置数据源后,我需要调用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; 
            }
    

    感谢所有付出时间的人。

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 1970-01-01
      • 2019-09-04
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多