Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > динамические двумерные массивы в VB


Автор: aaaate 17.4.2011, 22:39
 Здравствуйте форумчане. 
Задача моей программы выбирать нужную размерность матрицы (массива) и вводить туда данные, а потом выводить. 

Это нужно делать, путем создания динамического двумерного массива и закрепить его с каким-нить визуальным элементом. 

1) Можете на примере показать как создать динамический двумерный массив, чтобы пользователь мог вводить\выводить (от)туда данные? 
2) С каким визуальным элементом его будет проще всего связать, с TextBox, DataGrid?? 

Заранее спасибо, за то что обратили свое внимание на эту тему. 

Автор: diadiavova 17.4.2011, 23:30
Цитата(aaaate @  17.4.2011,  23:39 Найти цитируемый пост)
 Можете на примере показать как создать динамический двумерный массив, чтобы пользователь мог вводить\выводить (от)туда данные? 

Вопрос непонятен. Что значит "динамический массив"?
Цитата(aaaate @  17.4.2011,  23:39 Найти цитируемый пост)
С каким визуальным элементом его будет проще всего связать, с TextBox, DataGrid?? 

Можно попробовать DataGridView, но вообще для того, чтобы что-то советовать, надо иметь более полное представление о задаче. В принципе возможен вариант и с текстбоксами, расположенными в TableLayoutPanel.

Автор: aaaate 18.4.2011, 00:45
Динамический массив - размер которого определяется во время работы программы.

Вообще моя полная задача, - это создать программу , пользователь сможет выбирать требуемую размерность матрицы, введет данные (в какой-нить элемент управления DataGrid или TextBox, я новичок в этом, выберу, то что попроще), а моя программа решит это методом Гаусса и выдаст ответ(тоже в какой-нить элемент управления). У меня не хватит наглости всем этим грузить, я хочу сама разобраться.

Но вопрос о том, как создать динамический двумерный массив и как заполнять в него данные, честно говоря завел меня в ступор ((

Автор: diadiavova 18.4.2011, 09:39
Цитата(aaaate @  18.4.2011,  01:45 Найти цитируемый пост)
Динамический массив - размер которого определяется во время работы программы.

Ну здесь все просто
http://msdn.microsoft.com/ru-ru/library/w8k3cys2.aspx
Цитата(aaaate @  18.4.2011,  01:45 Найти цитируемый пост)
 DataGrid

Это устаревший контрол и его уже не используют, вместо него есть DataGridView, он вполне подойдет для твоей цели.

Цитата(aaaate @  18.4.2011,  01:45 Найти цитируемый пост)
Но вопрос о том, как создать динамический двумерный массив и как заполнять в него данные, честно говоря завел меня в ступор ((

А в чем проблема? У грида есть свойство Rows, возвращающее строки грида, туда можно программно добавлять строки удалять их и извлекать из них данные. У каждой строки есть свойство Cells, аналогичным образом возвращающее ячейки. Если надо работать с массивом(а это не самый лучший способ, предпочтительнее создать для матрицы собственный класс), то собственно данные надо переносить в двойном цикле: внешний обходит строки, внутренний - ячейки. 

Автор: aaaate 18.4.2011, 10:27
Спасибо конечно, с созданием массива разобрались, но
Цитата

Dim intArray(10, 10, 10) As Integer
ReDim Preserve intArray(10, 10, 20)
ReDim Preserve intArray(10, 10, 15)
ReDim intArray(10, 10, 10)


Это все равно несколько не то. !!Нужно, чтобы пользователь (обычный человек, не владеющий языком программирования) визуально сам выбрал размер требуемой для него матрицы. !! Я не знаю как это программно реализовать((

user posted image

Вот я нарисовала форму. Добавила 3 элемента DataGridView,
2 элемента NumericUpDown
в пункт (1) должно вводиться
user posted image
в пункте (2) пользователь должен регулировать размерность матрицы
потом нажимает "Решить" и в (3) DataGridView получит ответ

Как программно реализовать чтобы пользователь через элементы "NumericUpDown" выбрал нужную размерность матрицы?
Цитата

А в чем проблема? У грида есть свойство Rows, возвращающее строки грида, туда можно программно добавлять строки удалять их и извлекать из них данные.


Rows не вижу, только RowsDeafultCellStyle. Все равно это не решает проблему(( . Как программно добавлять, удалять и извлекать данные, я тоже пока что без понятий. 


Автор: aaaate 18.4.2011, 10:41
DataGridView более нагляден. Но увы, я не знаю, как через него реализовывать.
Поэтому для ввода матрицы скорей всего буду использовать InputBox, а для вывода решения TextBox.
думаю организовать что-то вроде этого:
Цитата

Использование динамического массива 

Чтобы отобразить код программы проекта Fixed Array, откройте Редактор кода.
Прокрутите его вверх до начала кода формы, в которой вы первоначально объявили фиксированный массив Massiv.
Удалите число 6 из объявления массива Massiv, чтобы массив стал динамическим. Этот оператор должен выглядеть так:

Dim Massiv() As Single
Добавьте под объявлением массива Massiv следующее объявление переменной:

Dim Stroki As Integer
Целочисленная переменная Stroki будет использована для получения ввода от пользователя и для задания размера динамического массива во время выполнения.

Прокрутите Редактор кода вниз, чтобы отобразить процедуру события Button1_Click, и измените ее код так, как показано ниже.

Dim Prompt, Title As String
Dim i As Short
Prompt = "Введите максимальное кол-во строк."
Stroki = InputBox("Кол-во строк?", "Создание массива")
If Stroki > 0 Then ReDim Massiv(Stroki - 1)
For i = 0 To UBound (Massiv)
    Title = "Строки " & (i + 1)
Massiv(i) = InputBox(Prompt, Title)
Next


думаю организовать что-то вроде этого. Код не большой, не так наглядно. Но мне уже хоть как-нибудь , пожертвую "красотой", главное чтоб работало.
Этот код для одномерного массива.
Как организовать тоже самое, но для двухмерного, объявление, ввод переменных?
Я признаться запуталась несколько в этом всем smile 

Автор: diadiavova 18.4.2011, 10:47
Цитата(aaaate @  18.4.2011,  11:27 Найти цитируемый пост)
Это все равно несколько не то. !!Нужно, чтобы пользователь (обычный человек, не владеющий языком программирования) визуально сам выбрал размер требуемой для него матрицы. !!

Это должен сделать не пользователь, а ты.
Цитата(aaaate @  18.4.2011,  11:27 Найти цитируемый пост)
Я не знаю как это программно реализовать((

Вот так ты объявляешь массив
Код

Dim matrix(,) As Double

А вот так изменяешь его размер
Код

ReDim matrix(Decimal.ToInt32(Me.NumericUpDown1.Value), _
         Decimal.ToInt32(Me.NumericUpDown2.Value))


Лучше будет, если размер будет устанавливаться либо через диалоговое окно, либо после выбора количества строк и столбцов пользователь должен будет нажать кнопку, подтверждающую выбор и по ее нажатию вносить изменения в массив и в грид.
Цитата(aaaate @  18.4.2011,  11:27 Найти цитируемый пост)
в пункт (1) должно вводиться

Не надо туда вносить имен переменных, их лучше вынести в заголовки столбцов грида, а в ячейки вноси значения.
Цитата(aaaate @  18.4.2011,  11:27 Найти цитируемый пост)
Rows не вижу

http://msdn.microsoft.com/ru-ru/library/system.windows.forms.datagridview.rows.aspx
Цитата(aaaate @  18.4.2011,  11:27 Найти цитируемый пост)
 Как программно добавлять, удалять и извлекать данные, я тоже пока что без понятий. 

Тебе надо работать с упомянутой коллекцией Rows и http://msdn.microsoft.com/ru-ru/library/system.windows.forms.datagridview.columns.aspx

Добавлено через 4 минуты и 56 секунд
Цитата(A5uKa @  18.4.2011,  11:41 Найти цитируемый пост)
Динамический Array в .NET и Resize - это плохо 

И чем это плохо? Применительно к данному случаю? То, что ты предлагаешь - кривой костыль, заменяющий встроенную функциональность.
Цитата(A5uKa @  18.4.2011,  11:45 Найти цитируемый пост)
п.с. и для отображения думаю подойдёт ListBox

И чем он лучше грида? smile 

Автор: aaaate 18.4.2011, 10:55
Цитата

Вот так ты объявляешь массив
код VB.NET
1:
Dim matrix(,) As Double

А вот так изменяешь его размер
код VB.NET
1:
2:
ReDim matrix(Decimal.ToInt32(Me.NumericUpDown1.Value), _
         Decimal.ToInt32(Me.NumericUpDown2.Value))


Спасибо. Попозже отпишусь, что получилось.

Автор: diadiavova 18.4.2011, 15:38

M
diadiavova
Последние сообщения не содержали ничего кроме флуда и были удалены.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)