C # LINQ ошибка, не могу понять, в чем проблема - PullRequest
0 голосов
/ 05 сентября 2011

У меня в программе отображается содержимое списков.Различные элементы в полосе меню позволяют пользователю видеть соответствующие данные в сетке данных при щелчке по элементу.Однако для одного конкретного списка у меня есть возможность отфильтровать результаты.При щелчке по этому элементу открывается диалоговое окно, которое позволяет пользователю фильтровать свои результаты.Это работает, и вы можете перейти к просмотру других списков, а затем нажать на элемент фильтра, чтобы попробовать новый поиск.Однако проблема, с которой я сталкиваюсь, возникает, когда вы сначала выполняете фильтрованный поиск с фильтром или без него, затем вместо перехода к другому списку вы делаете другой фильтрованный поиск с фильтром или без него.Ошибка действительно возникает, когда диалоговое окно появляется во второй раз, а не когда вы нажимаете кнопку, которая его принимает.

Ошибка, которую я получаю, выглядит следующим образом:

"в DataGridView произошло следующее исключение: System.IndexOutOfRangeException: индекс 0 не имеет значения. В System.Windows.Forms.CurrencyManager.ge_Item (Int32 index) в System.Windows.Forms.DatagridView.DataGridViewDataConnection.GetError (Int32 rowIndex To)замените это диалоговое окно по умолчанию, обработайте событие DataError. "

В пределах ошибки есть одна часть, которая изменяется в зависимости от того, в какой строке выбрана ячейка.«Индекс 0» изменится на «Индекс 3» или любой другой в зависимости от строки.

Код для этой части будет выглядеть следующим образом:

private void mnusViewParagraphHistory_Click(object sender, EventArgs e)
    {
        ViewHistoryFilter histFilter = new ViewHistoryFilter();
        int idFilt;
        string fundIDFilt = "";
        string changedBFilt = "";

        parHRes.Clear();
        if (parH.Count != 0)
        {
            if (histFilter.ShowDialog(this) == DialogResult.OK)
            {
                var parahistQuery = from his in parH
                                    select his;

                if (histFilter.txtID.Text.Trim() != "")
                {
                    idFilt = Convert.ToInt32(histFilter.txtID.Text.Trim());
                    parahistQuery = parahistQuery.Where(h => h.ID == idFilt);
                }

                if (histFilter.txtFundID.Text.Trim() != "")
                {
                    fundIDFilt = histFilter.txtFundID.Text.Trim();
                    parahistQuery = parahistQuery.Where(h => h.FundID.Contains(fundIDFilt.Trim()));
                }

                if (histFilter.txtChangedBy.Text.Trim() != "")
                {
                    changedBFilt = histFilter.txtChangedBy.Text.Trim();
                    parahistQuery = parahistQuery.Where(h => h.ChangedBy.Contains(changedBFilt.Trim()));
                }

                parHRes.AddRange(parahistQuery);
            }

            if (dataGridView1.DataSource != parHRes)
            {
                dataGridView1.DataSource = parHRes;
            }
        }
    }

Если я выполню то же самое, чтосоздает ошибку с другими элементами, она не повторяет ошибку.Другие элементы, однако, только изменяют источник данных, так как мне не нужно фильтровать, как показано ниже:

private void mnusViewParagraph_Click(object sender, EventArgs e)
    {
        if (dataGridView1.DataSource != parG)
        {
            dataGridView1.DataSource = parG;
        }
    }

Я не знаю, просто ли я слеп к реальной ошибке или нет, посмотрев наэто так долго, но если кто-то может помочь, это будет высоко ценится.

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

Когда обрабатывается событие ошибки данных, я обнаружил, что контекст ошибки является отображением со следующиминформация, предоставляемая трассировкой стека:

dataGridView1_DataError at offset 433 in file:line:column <filename unknown>:0:0
OnDataError at offset 370 in file:line:column <filename unknown>:0:0
OnDataErrorInternal at offset 47 in file:line:column <filename unknown>:0:0
GetError at offset 156 in file:line:column <filename unknown>:0:0
GetErrorText at offset 149 in file:line:column <filename unknown>:0:0
Paint at offset 179 in file:line:column <filename unknown>:0:0
PaintRows at offset 1551 in file:line:column <filename unknown>:0:0
PaintGrid at offset 675 in file:line:column <filename unknown>:0:0
OnPaint at offset 785 in file:line:column <filename unknown>:0:0
PaintWithErrorHandling at offset 161 in file:line:column <filename unknown>:0:0
WmPaint at offset 831 in file:line:column <filename unknown>:0:0
WndProc at offset 689 in file:line:column <filename unknown>:0:0
WndProc at offset 275 in file:line:column <filename unknown>:0:0
OnMessage at offset 19 in file:line:column <filename unknown>:0:0
WndProc at offset 49 in file:line:column <filename unknown>:0:0
DebuggableCallback at offset 100 in file:line:column <filename unknown>:0:0
DispatchMessageW at offset 0 in file:line:column <filename unknown>:0:0
System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop at offset 647 in file:line:column <filename unknown>:0:0
RunMessageLoopInner at offset 364 in file:line:column <filename unknown>:0:0
RunMessageLoop at offset 97 in file:line:column <filename unknown>:0:0
RunDialog at offset 51 in file:line:column <filename unknown>:0:0
ShowDialog at offset 911 in file:line:column <filename unknown>:0:0
mnusViewParagraphHistory_Click at offset 273 in file:line:column <filename unknown>:0:0
RaiseEvent at offset 115 in file:line:column <filename unknown>:0:0
OnClick at offset 70 in file:line:column <filename unknown>:0:0
HandleClick at offset 201 in file:line:column <filename unknown>:0:0
HandleMouseUp at offset 520 in file:line:column <filename unknown>:0:0
FireEventInteractive at offset 137 in file:line:column <filename unknown>:0:0
FireEvent at offset 280 in file:line:column <filename unknown>:0:0
OnMouseUp at offset 178 in file:line:column <filename unknown>:0:0
OnMouseUp at offset 38 in file:line:column <filename unknown>:0:0
WmMouseUp at offset 721 in file:line:column <filename unknown>:0:0
WndProc at offset 2362 in file:line:column <filename unknown>:0:0
WndProc at offset 42 in file:line:column <filename unknown>:0:0
WndProc at offset 74 in file:line:column <filename unknown>:0:0
WndProc at offset 54 in file:line:column <filename unknown>:0:0
OnMessage at offset 19 in file:line:column <filename unknown>:0:0
WndProc at offset 49 in file:line:column <filename unknown>:0:0
DebuggableCallback at offset 100 in file:line:column <filename unknown>:0:0
DispatchMessageW at offset 0 in file:line:column <filename unknown>:0:0
System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop at offset 647 in file:line:column <filename unknown>:0:0
RunMessageLoopInner at offset 364 in file:line:column <filename unknown>:0:0
RunMessageLoop at offset 97 in file:line:column <filename unknown>:0:0
Run at offset 49 in file:line:column <filename unknown>:0:0
Main at offset 77 in file:line:column <filename unknown>:0:0
_nExecuteAssembly at offset 0 in file:line:column <filename unknown>:0:0
ExecuteAssembly at offset 109 in file:line:column <filename unknown>:0:0
RunUsersAssembly at offset 42 in file:line:column <filename unknown>:0:0
ThreadStart_Context at offset 99 in file:line:column <filename unknown>:0:0
Run at offset 176 in file:line:column <filename unknown>:0:0
Run at offset 44 in file:line:column <filename unknown>:0:0
ThreadStart at offset 68 in file:line:column <filename unknown>:0:0

Это повторяется 3 раза, если вы принимаете диалоговое окно, которое оно продолжает без знака остановки.

1 Ответ

1 голос
/ 06 сентября 2011

Я понял, в чем проблема.Точка, в которой возникает ошибка, находится на линии

parHRes.Clear();

. Представлению данных не нравится, что список, используемый в качестве источника данных, теперь является нулевым.Добавление строки перед ним, чтобы изменить источник данных на что-то другое, решает эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...