索引超出范围错误;这里但不是吗?

时间:2009-05-28 13:52:04

标签: c# winforms data-binding controls devexpress

我有一个winform应用程序,它在运行时填充了许多dropdomn字段。每个表格都有一个Private void FillMaintFields() 我遇到了一个奇怪的错误,在1个表单上设置列可见性有效但在另一个表单上给出了索引超出范围错误!

以下是违规表单上的被取消方法 - >

 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相同的表格,其结构为 - >


| ItemID | CategoryID | ItemDescription | OrderID |活性|

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

想法?谢谢!

编辑1

基于一些评论和担忧: 该错误出现在尝试访问Columns []的第一行。违规表格上的任何地方和任何栏目。 如果我调试并查看myDataTable,它会显示正确的列和正确的数据。

5 个答案:

答案 0 :(得分:3)

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

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

lkuReleaseInfoUpdateAnnually.Properties.Columns[0]

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

答案 1 :(得分:1)

创建仍然可以重现问题的最小代码。调试那段代码;或者,如果没有帮助,请在此处发布。上面的代码并没有真正告诉我们任何事情:它太大了,对你的问题太具体了。我们不知道你的数据是什么样的,我们必须接受你的表结构 - 虽然C#似乎不同意。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分: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; 
        }

感谢所有给予时间的人。

相关问题