Ошибка индекса вне диапазона; Здесь, но не там? - PullRequest
1 голос
/ 28 мая 2009

У меня есть приложение 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 и получают доступ к ТОЧНОЙ таблице, которая имеет структуру ->


| ItemID | CategoryID | ItemDescription | OrderID | Активный |

Я в недоумении, почему это будет работать в 1 месте, а не в другом. Если я закомментирую часть Columns [] в неправильной форме, он вернет правильные данные без ошибок, но, конечно, будут видны ВСЕ столбцы.

Идеи? Спасибо!

РЕДАКТИРОВАТЬ 1

На основании некоторых комментариев и проблем: Ошибка появляется в первой строке, которая пытается получить доступ к столбцам []. Где и где бы ни находился столбец, который может быть в оскорбительной форме. Если я отлаживаю и смотрю на myDataTable, он показывает правильные столбцы и правильные данные.

Ответы [ 5 ]

3 голосов
/ 28 мая 2009

Ошибка возникает в «lkuReleaseInfoUpdateAnnually» или «lkuMinContactSchedule»? Какой именно это контроль? Кажется, ошибка связана с управлением, похоже, что ваш элемент управления во второй форме не имеет всех столбцов, которые вы ожидаете.

РЕДАКТИРОВАТЬ: Вы, кажется, путаете столбцы в таблице данных со столбцами в ваших элементах управления. Я не уверен, какой элемент управления вы используете, но делаете:

lkuReleaseInfoUpdateAnnually.Properties.Columns[0]

НЕ означает, что вы индексируете в DataTable. Вы индексируете столбцы вашего элемента управления, которые могут быть или не быть там.

1 голос
/ 28 мая 2009

У меня есть некоторые идеи о том, как лучше указать ошибки и их происхождение. Что вы должны сделать, это посмотреть значение «lkuDiabeticTeaching.Properties.Columns.Count», если оно меньше 1, значит, у вас нет столбцов и, возможно, потому, что не произошло заполнения.

1 голос
/ 28 мая 2009

Создайте минимальный код, который все еще воспроизводит проблему. Отладить этот код; или, если это не поможет, опубликуйте это здесь. Приведенный выше код ничего не говорит нам: он слишком большой, слишком специфичен для вашей проблемы. Мы не знаем, как выглядят ваши данные, мы должны принять ваше слово за структуру таблицы - хотя C #, похоже, не согласен.

В общем, любая помощь, которую кто-либо может предложить, является просто нечеткой догадкой.

0 голосов
/ 28 мая 2009

Ну, я понял это. Своего рода. По какой-то причине мне нужно позвонить 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; 
        }

Спасибо всем, кто дал там время.

0 голосов
/ 28 мая 2009

Единственное, что я вижу, это то, что в первом наборе кода отсутствует вызов PopulateForms () (он включен во второй набор). Может ли это быть?

...