Организация ввода-вывода двумерных массивов
Ввод двумерного массива немногим отличается от ввода одномерного массива. Сложнее обстоит дело с выводом двумерного массива, если при выводе пытаться отобразить структуру массива. К сожалению, все три элемента управления, хорошо справляющиеся с отображением одномерного массива, плохо приспособлены для показа структуры двумерного массива. Хотя у того же элемента ListBox есть свойство MultiColumn, включение которого позволяет показывать массив в виде строк и столбцов, но это не вполне то, что нужно для наших целей — отображения структуры двумерного массива. Хотелось бы, чтобы элемент имел такие свойства, как Rows и Columns, а их у элемента ListBox нет. Нет их и у элементов ComboBox и CheckedListBox. Приходится обходиться тем, что есть. На рис. 6.5 показан пример формы, поддерживающей работу по вводу и выводу двумерного массива.

Рис. 6.5. Форма, поддерживающая ввод и вывод двумерного массива
Интерфейс формы схож с тем, что использовался для организации работы с одномерным массивом. Схожа и программная организация ввода-вывода элементов массива. Поэтому я не буду приводить код, поддерживающий работу с формой TwoDimArrayForm, надеясь, что читатель при желании сможет его восстановить. Остановлюсь лишь на одном моменте, позволяющем отображать двумерный массив в элементе управления ListBox так, чтобы сохранялась структура строк и столбцов массива. Этого можно добиться за счет программной настройки размеров элемента управления ListBox:
listBox1.Height = n * HEIGHT_LINE;
listBox1.Width = m * 2 * HEIGHT_LINE;
Константа HEIGHT_LINE задает высоту строки в списке. Вначале водятся элементы первого столбца; когда весь столбец введен, автоматически следующее вводимое значение будет отображаться в первой строке в следующем столбце.
В общей ситуации, когда значения, вводимые пользователем, могут колебаться в широком диапазоне, трудно гарантировать отображение структуры двумерного массива. Однако ситуация не безнадежна. Есть и другие, более мощные и более подходящие для наших целей элементы управления. Если на элементах ListBox и подобных ему я останавливаться не буду, оставляя их для самостоятельного изучения, то об элементе DataGridView расскажу подробнее.
Элемент управления DataGridView и отображение массивов
Элемент управления DataGridView является последней новинкой в серии табличных элементов DataGrid, позволяющих отображать таблицы. Главное назначение этих элементов — связывание с таблицами внешних источников данных, прежде всего с таблицами баз данных. Мы же сейчас рассмотрим другое его применение — в интерфейсе, позволяющем пользователю вводить и отображать матрицы — двумерные массивы.
Рассмотрим классическую задачу умножения прямоугольных матриц C=A*B. Построим интерфейс, позволяющий пользователю задавать размеры перемножаемых матриц, вводить данные для исходных матриц A и B, перемножать матрицы и видеть результаты этой операции. На рис. 6.6 показан возможный вид формы, поддерживающей работу пользователя. Форма показана в тот момент, когда пользователь уже задал размеры и значения исходных матриц, выполнил умножение матриц и получил результат.

увеличить изображение Рис. 6.6. Форма с элементами DataGridView, поддерживающая работу с матрицами
На форме расположены три текстовых окна для задания размеров матриц, три элемента DataGridView для отображения матриц, три командные кнопки для выполнения операций, доступных пользователю. Кроме того, на форме присутствуют 9 меток (элементов управления label), семь из которых видимы на рис. 6.6. В них отображается информация, связанная с формой и отдельными элементами управления. Текст у невидимых на рисунке меток появляется тогда, когда обнаруживается, что пользователь некорректно задал значение какого-либо элемента исходных матриц.
А теперь перейдем к описанию того, как этот интерфейс реализован. В классе Form2, которому принадлежит наша форма, зададим поля, определяющие размеры матриц, и сами матрицы:
//поля класса Form
int m, n, p; //размеры матриц
double[,] A, B, C; //сами матрицы
Рассмотрим теперь, как выглядит обработчик события «Click» командной кнопки «Создать DataGridView». Предполагается, что пользователь разумен и, прежде чем нажать эту кнопку, задает размеры матриц в соответствующих текстовых окнах. Напомню, что при перемножении матриц размеры матриц должны быть согласованы — число столбцов первого сомножителя должно совпадать с числом строк второго сомножителя, а размеры результирующей матрицы определяются размерами сомножителей. Поэтому для трех матриц в данном случае достаточно задать не шесть, а три параметра, определяющие размеры.
Обработчик события выполняет три задачи — создает сами матрицы, осуществляет чистку элементов управления DataGridView, удаляя предыдущее состояние, затем добавляет столбцы и строки в эти элементы в полном соответствии с заданными размерами матриц. Вот текст обработчика:
private void button1_Click(object sender, EventArgs e)
A = new double[m, n];
B = new double[n, p];
C = new double[m, p];
//Чистка DGView, если они не пусты
for (int i = 0; i < k; i++)
//Заполнение DGView столбцами
//Заполнение DGView строками
Прокомментирую этот текст.
Прием размеров и создание матриц, надеюсь, не требует дополнительных комментариев.
Чистка предыдущего состояния элементов DataGridView сводится к удалению столбцов. Продемонстрированы два возможных способа выполнения этой операции. Для первого элемента показано, как можно работать с коллекцией столбцов. Организуется цикл по числу столбцов коллекции, и в цикле выполняется метод RemoveAt, аргументом которого является индекс удаляемого столбца. Поскольку после удаления столбца происходит перенумерация столбцов, на каждом шаге цикла удаляется первый столбец, индекс которого всегда равен нулю. Удаление столбцов коллекции можно выполнить одним махом — вызывая метод Clear() коллекции, что и делается для остальных двух элементов DataGridView.
После чистки предыдущего состояния, можно задать новую конфигурацию элемента, добавив в него вначале нужное количество столбцов, а затем и строк. Эти задачи выполняют специально написанные процедуры AddColumns и AddRows. Вот их текст:
private void AddColumns(int n, DataGridView dgw)
//добавляет n столбцов в элемент управления dgw
//Заполнение DGView столбцами
for (int i = 0; i < n; i++)
column = new DataGridViewTextBoxColumn();
column.DataPropertyName = «Column» + i.ToString();
column.Name = «Column» + i.ToString();
private void AddRows(int m, DataGridView dgw)
//добавляет m строк в элемент управления dgw
//Заполнение DGView строками
for (int i = 0; i < m; i++)
Приведу краткий комментарий.
Создаются столбцы в коллекции Columns по одному. В цикле по числу столбцов матрицы, которую должен отображать элемент управления DataGridView, вызывается метод Add этой коллекции, создающий очередной столбец. Одновременно в этом же цикле создается и имя столбца (свойство Name), отображаемое в форме. Показана возможность формирования еще одного имени (DataPropertyName), используемого при связывании со столбцом таблицы внешнего источника данных. В нашем примере это имя не используется.
Создав столбцы, нужно создать еще и нужное количество строк у каждого из элементов DataGridView. Делается это аналогичным образом, вызывая метод Add коллекции Rows. Чуть по-другому задаются имена строк — для этого используется специальный объект HeaderCell, имеющийся у каждой строки и задающий ячейку заголовка.
После того как сформированы строки и столбцы, элемент DataGridView готов к тому, чтобы пользователь или программа вводила значения в ячейки сформированной таблицы.
Рассмотрим теперь, как выглядит обработчик события «Click» следующей командной кнопки «Перенести данные в массив». Предполагается, что пользователь разумен и, прежде чем нажать эту кнопку, задает значения элементов перемножаемых матриц в соответствующих ячейках подготовленных таблиц первых двух элементов DataGridView. Обработчик события выполняет следующие задачи — в цикле читает элементы, записанные пользователем в таблицы DataGridView, проверяет их корректность и в случае успеха переписывает их в матрицы. Вот текст обработчика:
private void button2_Click(object sender, EventArgs e)
bool correct = true;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
A[i, j] = Convert.ToDouble(elem);
catch (Exception any)
label8.Text = «Значение элемента» +
«A[» + i.ToString() +», » + j.ToString() + » ]»
+ » не корректно. Повторите ввод!»;
for (int i = 0; i < n; i++)
for (int j = 0; j < p; j++)
B[i, j] = Convert.ToDouble(elem);
catch (Exception any)
label9.Text = «Значение элемента» +
«B[» + i.ToString() + «, » + j.ToString() + «]»
+ » не корректно. Повторите ввод!»;
Form3 frm = new Form3();
«B[» + i.ToString() + «,» + j.ToString() + «] justify»> frm.ShowDialog();
Этот программный код нуждается в подробных комментариях.
Основная задача переноса данных из таблицы элемента DataGridView в соответствующий массив не вызывает проблем. Конструкция Rows[i].Cells[j] позволяет добраться до нужного элемента таблицы, после чего остается присвоить его значение элементу массива.
Как всегда при вводе основной проблемой является обеспечение корректности вводимых данных. Схема, рассматриваемая нами ранее, нуждается в корректировке. Дело в том, что ранее проверка корректности осуществлялась сразу же после ввода пользователем значения элемента. Теперь проверка корректности выполняется после того, как пользователь полностью заполнил таблицы, при этом некоторые элементы он мог задать некорректно. Просматривая таблицу, необходимо обнаружить некорректно заданные значения и предоставить возможность их исправления. В программе предлагаются два различных подхода к решению этой проблемы.
Первый подход демонстрируется на примере ввода элементов матрицы A. Как обычно, преобразование данных, введенных пользователем, в значение, допустимое для элементов матрицы А, помещается в охраняемый блок. Если данные некорректны и возникает исключительная ситуация, то она перехватывается универсальным обработчиком catch(Exception). Заметьте, в данном варианте нет цикла, работающего до тех пор, пока не будет введено корректное значение. Обработчик исключения просто прерывает работу по переносу данных, вызывая оператор return. Но предварительно он формирует информационное сообщение об ошибке и выводит его в форму. (Помните, специально для этих целей у формы были заготовлены две метки). В сообщении пользователю предлагается исправить некорректно заданный элемент и повторить ввод — повторно нажать командную кнопку «перенести данные в массив». Этот подход понятен и легко реализуем. Недостатком является его неэффективность, поскольку повторно будут переноситься в массив все элементы, в том числе и те, что были введены вполне корректно. У программиста такая ситуация может вызывать чувство неудовлетворенности своей работой.
На примере ввода элементов матрицы В продемонстрируем другой подход, когда исправляется только некорректно заданное значение. Прежде чем читать дальше, попробуйте найти собственное решение этой задачи. Это не так просто, как может показаться с первого взгляда. Для организации диалога с пользователем пришлось организовать специальное диалоговое окно, представляющее обычную форму с двумя элементами управления — меткой для выдачи информационного сообщения и текстовым окном для ввода пользователем корректного значения. При обнаружении ошибки ввода открывается диалоговое окно, в которое пользователь вводит корректное значение элемента и закрывает окно диалога. Введенное пользователем значение переносится в нужную ячейку таблицы DataGridView, а оттуда в матрицу.
При проектировании диалогового окна значение свойства формы FormBorderStyle, установленное по умолчанию как «sizeable», следует заменить значением «FixedDialog», что влияет на внешний вид и поведение формы. Важно отметить, что форма, представляющая диалоговое окно, должна вызываться не методом Show, а методом ShowDialog. Иначе произойдет зацикливание, начнут порождаться десятки диалоговых окон, прежде чем вы успеете нажать спасительную в таких случаях комбинацию Ctrl+ Alt + Del.
Обработчик события «Click» командной кнопки «Умножить матрицы» выполняет ответственные задачи — реализует умножение матриц и отображает полученный результат в таблице соответствующего элемента DataGridView. Но оба эти действия выполняются естественным образом, не требуя, кроме циклов, никаких специальных средств и программистских ухищрений. Я приведу программный код без дополнительных комментариев:
Как вывести массив в datagridview c
Public Sub addGridParam(N As String (), Grid As DataGridView )
donitox / dataGridView.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
| dataGridView1 . RowCount = N ; |
| dataGridView1 . ColumnCount = M ; |
| int i , j ; |
| for ( i = 0 ; i < N ; ++ i ) |
| for ( j = 0 ; j < M ; ++ j ) |
| dataGridView1 . Rows [ i ]. Cells [ j ]. Value = mas [ i , j ]; |
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Show 2d-array in DataGridView
I have a 2D array. I want to print the array in my DataGridView but it throws an error:
[Argument OutOfRangeException was unhandled ]
This is my code
![]()
3 Answers 3
As comments have pointed out, you should focus on rows and cells. You need to build your DataGridView columns and then populate each row cell by cell.
The width of your array should correspond to your dgv columns and the height to the dgv rows. Take the following as a simple example:
![]()
for exemple for 2 elements
![]()
The first potential problem is with how you are accessing your array indexes. Which can be handled this way.
Just check your array dimension length first. Clearly one of your variables height or width is incorrect.
2-dimensional Integer array to DataGridView
How would I go about displaying a 2-dimensional integer array into a DataGridView Control in C# .Net 4.0?
2 Answers 2
Follow the code sample on this page to populate the Rows property:
Edit
Turns out this is a bit thornier than I thought. Here’s a code example:
to get Merlyn’s solution to work you’ll need to set the column count before you add rows to the datagridview:
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Как вывести массив в datagridview c
Вызываем функцию передавая в нее текстовый массив и ссылку на DataGridView
addGridParam
‘функция заполнения таблицы
‘N — массив который мы хотим отобразить
‘Grid — ссылка на визуальный компонент DataGridView для отобажения в ней информации
Public Sub addGridParam(N As String (), Grid As DataGridView )
‘если длинна массива больше чем количество элементов массива то добавляем столбцы