Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с Двумерным Массивом из TextBoxов 
:(
    Опции темы
ldk13
Дата 11.10.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Нужно при запуске программы сгенерировать массив 3 на 4 из текстбоксов, а потом по нажатии на кнопку "+", увеличивать количество текстбоксов в массиве. 

Вот мой код: 
Цитата

private void Form1_Load(object sender, EventArgs e)
        {
            int i, j;
            TextBox[,] tb = new TextBox[n, n + 1];
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                                      
                    tb[i, j].Name = "a" + i.ToString() + j.ToString();
                    tb[i, j].Size = new System.Drawing.Size(50, 20);
                    tb[i, j].Left = (10 + (i) * 80);
                    tb[i, j].Top = (56 + (j) * 26);
                    tb[i, j].TabIndex = 20 * (i + 1) + j;
                    Controls.Add(tb[i, j]);
                }
            }
        }



Компилятор ругается, говорит что в этой 
Цитата

tb[i, j].Name = "a" + i.ToString() + j.ToString();
 и последующих строчках
Цитата

В экземпляре объекта не задана ссылка на объект.


Цитата

System.NullReferenceException was unhandled

  

Не подскажите как наладить? Нужно только заполнение, увеличивание размерности я потом допишу.
PM MAIL   Вверх
elbjarn
Дата 11.10.2008, 18:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Код

private void Form1_Load(object sender, EventArgs e)
        {
            int i, j;
            TextBox[,] tb = new TextBox[n, n + 1];
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    tb[i, j] = new TextBox();                  
                    tb[i, j].Name = "a" + i.ToString() + j.ToString();
                    tb[i, j].Size = new System.Drawing.Size(50, 20);
                    tb[i, j].Left = (10 + (i) * 80);
                    tb[i, j].Top = (56 + (j) * 26);
                    tb[i, j].TabIndex = 20 * (i + 1) + j;
                    Controls.Add(tb[i, j]);
                }
            }
        }

PM MAIL ICQ   Вверх
ldk13
Дата 11.10.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Хм) Я сам нашёл способ

Добавлено через 2 минуты и 39 секунд
именно так и сделалsmile Спасибо
PM MAIL   Вверх
ldk13
Дата 11.10.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



У меня ещё вопрос есть.

Цитата

public void add()
        {
            int i, j;
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    a[i, j] = new TextBox();
                    a[i, j].Size = new System.Drawing.Size(50, 20);
                    a[i, j].Left = (10 + (j) * 80);
                    a[i, j].Top = (56 + (i) * 26);
                    Controls.Add(a[i, j]);
                }
            }

            for (i = 0; i < n; i++)
            {
                b[i] = new TextBox();
                b[i].Size = new System.Drawing.Size(50, 20);
                b[i].Left = (10 + (n) * 80);
                b[i].Top = (56 + (i) * 26);
                Controls.Add(b[i]);

            }

            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    lb[i, j] = new Label();
                    lb[i, j].Size = new System.Drawing.Size(24, 13);
                    lb[i, j].Left = (63 + (i) * 80);
                    lb[i, j].Top = (59 + (j) * 26);
                    if ((i == n - 1) || (j == n))
                        lb[i, j].Text = "x" + (i + 1).ToString() + "=";
                    else
                        lb[i, j].Text = "x" + (i + 1).ToString() + "+";
                    Controls.Add(lb[i, j]);
                }
            }

        }



Этот код добавляет компоненты на форму, а как стирать с формы компоненты?
Как очистить форму от всего? А ещё лучше как очистить её от того что тебе нужно.

Это сообщение отредактировал(а) ldk13 - 11.10.2008, 21:49
PM MAIL   Вверх
Partizan
Дата 12.10.2008, 01:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



Controls.Remove в помощь


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
ldk13
Дата 12.10.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Partizan, спасибо. Разобрался. 

И у меня встал еще один вопрос : а как к созданным программно текст боксам прикрутить обработчики событий?! (Ошибочки же надо  отловить)

Добавлено через 6 минут и 15 секунд
a[i,j].TextChanged

как вот с этим работать?
PM MAIL   Вверх
ldk13
Дата 12.10.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Сформулирую вопрос еще точнее: Мне надо обработать все созданные текстбоксы обработчиком KeyDown, чтобы запретить ввод всего кроме чисел. Пихаю всё это в цикл

Код

for (i=0;i<n; i++)
{
   for 
   {
        // Здесь пишу обработчики событий
   }
}


Обработчик такой. 
a[i,j].KeyDown

Как с ним работать?  чтобы у меня был такой эффект:  
Код

if (! (e.KeyChar >= (char) 48 && e.KeyChar <= (char) 57)) 
e.Handled = true;

PM MAIL   Вверх
gambit
Дата 12.10.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 5
Всего: 40



Код

имя компонента.KeyDown += new System.Windows.Forms.KeyEventHandler(имя процедуры в которой написан обработчик);


PM MAIL ICQ Skype   Вверх
elbjarn
Дата 12.10.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(gambit @ 12.10.2008,  15:24)
Код

имя компонента.KeyDown += new System.Windows.Forms.KeyEventHandler(имя процедуры в которой написан обработчик);


или даже проще

Код

имя компонента.KeyDown += имя процедуры в которой написан обработчик;


при условии, что "имя процедуры в которой написан обработчик" имеет такой же тип (т.е. сигнатуру), что и делегат для KeyDown
PM MAIL ICQ   Вверх
ldk13
Дата 12.10.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Я вот не понял как мне обработчик такой написать
Код


        private void error_handler (object sender, KeyEventArgs e)
        {
            if (!(e.KeyChar >= (char)48 && e.KeyChar <= (char)57))
                e.Handled = true;
        }


Что бы он правильно! работал. Что надо с e сделать чтобы там появилось e.KeyChar?
PM MAIL   Вверх
Dennnis
Дата 12.10.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Цитата(ldk13 @  12.10.2008,  15:49 Найти цитируемый пост)
Что бы он правильно! работал. Что надо с e сделать чтобы там появилось e.KeyChar? 
 Нужно создать обработчик для KeyPress, тогда 'e' будет KeyPressEventArgs, а не KeyEventArgs.

--------------------
Get Rich or Die Tryin'
PM   Вверх
ldk13
Дата 12.10.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Вот я пытаюсь создать обработчик события KeyDown:
Код

 a[i, j].KeyDown += new System.Windows.Forms.KeyEventHandler();


и у меня есть метод, где указано, как следует обрабатывать:
Код


  private void error_handler(object sender, KeyPressEventArgs e)
        {
            if (!(e.KeyChar >= (char)48 && e.KeyChar <= (char)57))
                e.Handled = true;
        }



Но я не пойму что вводить надо вот тут:
Код

 a[i, j].KeyDown += new System.Windows.Forms.KeyEventHandler(Именно тут!);


Если я пишу так:
Код

a[i, j].KeyDown += new System.Windows.Forms.KeyEventHandler(error_handler());


То выдается ошибка, ему надо указать аргументы.

А если написать с аргументами:
Код

a[i, j].KeyDown += new System.Windows.Forms.KeyEventHandler(error_handler(sender, e));


то он говорит что ожидается метод...

что делать?
PM MAIL   Вверх
Dennnis
Дата 12.10.2008, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Цитата(ldk13 @  12.10.2008,  17:05 Найти цитируемый пост)
что делать? 

Писать вот так:
Код

a[i, j].KeyDown += new System.Windows.Forms.KeyEventHandler(error_handler);
 или вот так:
Код

a[i, j].KeyDown += error_handler;
 
Но e.KeyChar при этом не появится. Что бы появился e.KeyChar нужно использовать событие KeyPress, вот так
Код

        ...
        {
              a[i, j].KeyPress +=new KeyPressEventHandler(error_handler);
        }
        private void error_handler(object sender, KeyPressEventArgs e)
        {
            if (!(e.KeyChar >= (char)48 && e.KeyChar <= (char)57))
                e.Handled = true;
        }
        ...


Это сообщение отредактировал(а) Dennnis - 12.10.2008, 17:26
--------------------
Get Rich or Die Tryin'
PM   Вверх
ldk13
Дата 12.10.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Код

...
a[i, j].KeyPress += new KeyPressEventHandler(error_handler);
a[i, j].KeyDown += new KeyEventHandler (error_handler); // Тут ругается компилятор
...

 private void error_handler(object sender1, KeyPressEventArgs e1)
     {
         if (!(e1.KeyChar >= (char)48 && e1.KeyChar <= (char)57))
         e1.Handled = true;
     }


так не выходит. Компилятор ругается на 2 строчку: 
Error    1    No overload for 'error_handler' matches delegate 'System.Windows.Forms.KeyEventHandler'    

что - то не так...
PM MAIL   Вверх
ldk13
Дата 12.10.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 11.10.2008
Где: Питер

Репутация: нет
Всего: нет



Сорри, нужно не KeyDown, a KeyPress

Добавлено через 1 минуту и 32 секунды
всё работает)

Спасибо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1081 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.