Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
maxwel6064
3 / 3 / 1
Регистрация: 13.11.2012
Сообщений: 109
#1

Добавление данных из одного datagridview в другой - C#

23.09.2013, 19:10. Просмотров 1425. Ответов 5
Метки нет (Все метки)

Добрый день. Делаю своеобразный интернет-магазин с использованием c#. Есть 2 datagridview. Первый выступает в качестве каталога товаров, другой в качестве покупательской корзины.
Структура первого datagridview такая:
кнопка id производитель название количество цена
Структура второго datagridview:
id производитель название количество цена

Т.е. при нажатии на кнопку в 1 datagridview вся строка должна переноситься в другой datagridview. Пытаюсь это выполнить следующим образом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            int kiekis = 0;
            if (e.RowIndex != -1)
            {
                if (e.ColumnIndex == 0)
                {
                    kiekis = Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[4].Value);
                    UpdateData(e.RowIndex, kolichestvo);
                    ObshajaSuma();
                }
            }
        }
C#
1
2
3
4
5
6
7
8
9
private void UpdateData(int index, int kolichestvo)
        {
            int id = Convert.ToInt32(dataGridView1.Rows[index].Cells[1].Value);
            float cena = Convert.ToSingle(dataGridView1.Rows[index].Cells[5].Value);
            string nazvanie = dataGridView1.Rows[index].Cells[3].Value.ToString();
            string proizvoditel = dataGridView1.Rows[index].Cells[2].Value.ToString();
            if (kolichestvo > 0)
                dataGridView2.Rows.Insert(index,id, proizvoditel,nazvanie, 1, 1 * cena);
        }
ошибка возникает в функции updateData в строчке: dataGridView2.Rows.Insert. В каталоге у меня заполнено товаром десять строк, каждая строка имеет свою кнопку, которая позволяет добавлять в корзину (в datagridview2). Проблема состоит в том, что если при загрузке формы с первым datagridview, я к примеру нажимаю на первый товар с нулевым индексом, товар все нормально переносится во вторую таблицу, а если при загрузке формы я нажимаю на вторую строку (т.е. с индексом 1) программа сразу начинает виснуть и выдается следующая ошибка:

Row index provided is out of range.
Parameter name: rowIndex

В чем может быть ошибка? Никак не могу понять. Очень надеюсь на вашу помощь. Заранее благодарен.

Добавлено через 3 часа 55 минут
неужели нет никаких соображений в чем может быть ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2013, 19:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Добавление данных из одного datagridview в другой (C#):

Случайная выборка записей из одного DataGridView и добавление их в другой - C#
у меня есть dgw1 и dgw2 как выбрать записи(строки)случайным образом из dgw1 и добавить dgw2???

Передача данных из одного DataGridView в другой - C#
Есть 2 DataGridView. DataGridView1 - полностью заполенный инфой, и есть DataGridView2 - только что пустой вынесенный на форму. Нужно...

Перенос данных из одного DataGridView в другой - C#
Здравствуйте! Возник вопрос. Я в коде создал объект DataGridView записал в его row's данные. Теперь хочу из этого объекта перенести...

Сохранение данных в одной и добавление их в другой datagridview - C#
Есть две таблицы поставщики и склад. Как сделать чтоб при добавлении товаров в таблицу поставщиков они добавлялись в склад

Копирование записи из одного DataGridView в другой - C#
В общем название само себя объясняет. Суть: я выбираю запись в DataGridView и нажимаю на кнопку. Эта выбранная запись копируется в другой...

Перемещение строк из одного DataGridView в другой - C#
Ув. форумчане, помогите решить проблему с перемещением!!! Я в этом деле новичок, так что если будет чё не понятно спрашивайте!!! Суть...

5
sezada
206 / 162 / 3
Регистрация: 11.09.2013
Сообщений: 445
23.09.2013, 19:42 #2
index у Вас может быть большим числом. поясню: покупатель выбирает товар, который находится в сотой строке. индекс равен 99. но в корзине еще нет ничего. при этом вы пытаетесь вставить 99-ю строку (читаем мсдн: Параметры
rowIndex
Тип: System.Int32
Позиция, в которую вставляется строка.)

получаете ошибку, что 99 строки нету. используйте Rows.Add или Rows.Insert(Rows.Coun - 1, obj[] params)
0
maxwel6064
3 / 3 / 1
Регистрация: 13.11.2012
Сообщений: 109
23.09.2013, 20:49  [ТС] #3
Большое спасибо. Данная ошибка исчезла, однако появилась другая проблема со вторым datagridview.
Его структура такая:
id производитель название количество цена + -
+ и - это кнопки, которые означают увеличение или уменьшение количества товаров(т.е. при нажатии на + значение количества увеличивается на 1, если -, то уменьшается на 1).
Вот мой код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
             int kolichestvo2 = 0;
             if (e.RowIndex >=0)
             {
                 if (e.ColumnIndex == 5)
                 {
                     kolichestvo2 = Convert.ToInt32(dataGridView2.Rows[e.RowIndex].Cells[3].Value);
                     kolichestvo2++;
                     UpdateData2(e.RowIndex, kolichestvo2);
                     ObshajaSumma();
                     
                 }
                 if (e.ColumnIndex == 6)
                 {
                     kolichestvo2 = Convert.ToInt32(dataGridView2.Rows[e.RowIndex].Cells[3].Value);
                     kolichestvo2--;
                     UpdateData2(e.RowIndex, kolichestvo2);
                     ObshajaSumma();
                 }
             }
C#
1
2
3
4
5
6
7
8
9
10
        private void UpdateData2(int index, int kiekis)
        {
            int id = Convert.ToInt32(dataGridView1.Rows[index].Cells[1].Value);
            float cena = Convert.ToSingle(dataGridView1.Rows[index].Cells[5].Value);
            string nazvanie = dataGridView1.Rows[index].Cells[3].Value.ToString();
            string proizvoditel = dataGridView1.Rows[index].Cells[2].Value.ToString();
            dataGridView2.Rows.RemoveAt(index);
            if (kiekis > 0)
                dataGridView2.Rows.Add(id,proizvoditel, nazvanie, kolichestvo, kolichestvo * cena);
        }
Проблема состоит в следующем: после того как из основного каталога был добавлен товар в корзину, и если человек хочет увеличить количество товара, количество увеличивается, но почему-то увеличивается количество не этого товара, а товара из каталога, который находится на 0 индексе, таким образом, при нажатии на + программа обновляет datagridview и подставляет значения из каталога. в чем может быть проблема в данной ситуации?
0
sezada
206 / 162 / 3
Регистрация: 11.09.2013
Сообщений: 445
23.09.2013, 21:12 #4
из того, что я понял:

- проблема та же самая. Вы передаете индекс от №2 (здесь и далее - DataGridView2) в №1, и используете его в №1, как будто это его индекс. вот и ошибка
- Вы совершенно не заботитесь о поддержке кода. контролы не переименованы, комментариев нет. через три дня отдыха от кода Вы наверняка уже не вспомните, какой контрол - каталог, а какой - корзины. но, к счастью, это будет Вашей проблемой, а моя - желание Вам помочь в анализе трудночитаемого кода. не хочу обидеть, но немного неприятно

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

C#
1
if (e.ColumnIndex == 5)
используйте, пожалуйста, так:

C#
1
2
3
4
5
6
const int INCREASE_COUNT_COLUMN_INDEX = 5;
 
...много кода...
 
// если клик был по ячейке "увеличить"
if (e.ColumnIndex == INCREASE_COUNT_COLUMN_INDEX)
0
maxwel6064
3 / 3 / 1
Регистрация: 13.11.2012
Сообщений: 109
23.09.2013, 21:29  [ТС] #5
Вот код, закомментировал его:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
             int kolichestvo2 = 0; //
             if (e.RowIndex >=0)
             {
                 if (e.ColumnIndex == 5) //если была нажата кнопка плюс(5 - индекс кнопки в datagridview)
                 {
                     kolichestvo2 = Convert.ToInt32(dataGridView2.Rows[e.RowIndex].Cells[3].Value); //сюда получаю код из 3 столбца, в нем хранится количество товара
                     kolichestvo2++; //увеличиваю на единицу
                     UpdateData2(e.RowIndex, kolichestvo2); //переда в функцию значение строки и количество товара
                     ObshajaSumma(); //вычисляется сумма товара в корзине
                     
                 }
                 if (e.ColumnIndex == 6) //если была нажата кнопка минус(6 - индекс кнопки в datagridview)
                 {
                     kolichestvo2 = Convert.ToInt32(dataGridView2.Rows[e.RowIndex].Cells[3].Value); ////сюда получаю код из 3 столбца, в нем хранится количество товара
                     kolichestvo2--;//уменьшаю на единицу
                     UpdateData2(e.RowIndex, kolichestvo2); //переда в функцию значение строки и количество товара
                     ObshajaSumma();   //вычисляется сумма товара в корзине
                 }
             }
C#
1
2
3
4
5
6
7
8
9
10
        private void UpdateData2(int index, int kiekis)
        {
            int id = Convert.ToInt32(dataGridView1.Rows[index].Cells[1].Value); //из datagridview1, в котором находится каталог, получаю значение столбца с id товара
            float cena = Convert.ToSingle(dataGridView1.Rows[index].Cells[5].Value); //получаю цену из 5 столбца
            string nazvanie = dataGridView1.Rows[index].Cells[3].Value.ToString(); //получаю название товара из 3 столбца
            string proizvoditel = dataGridView1.Rows[index].Cells[2].Value.ToString(); //получаю компанию-производителя из 2 столбца
            dataGridView2.Rows.RemoveAt(index);//удаляю повторяющиеся элементы
            if (kolichestvo > 0) // если количество больше нуля, заношу в корзину во второй datagridview
                dataGridView2.Rows.Add(id,proizvoditel, nazvanie, kolichestvo, kolichestvo * cena);
        }
0
sezada
206 / 162 / 3
Регистрация: 11.09.2013
Сообщений: 445
23.09.2013, 22:41 #6
действительно, Вы получаете id, цену и производителя по индексу, соответствующему строке в корзине, но из каталога (т.е. неверный). так туда и попадает неверная строка. к тому же я не вижу необходимости в удалении целой строки и добавлении ее заново: можно ведь просто нарастить value в соответствующем Cell
1
23.09.2013, 22:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 22:41
Привет! Вот еще темы с ответами:

Передать значение из одного DataGridView в другой - C#
У меня на форме есть два DataGridView, из пяти колумнов. И так мне надо чтобы при нажатии кнопки выбранная строка передалась в другой...

Добавление строк в DataGridView из другой формы - C#
Есть 2 формы. На первой DataGridView1 и кнопка добавить. Делаю так: private void button1_Click(object sender, EventArgs e) ...

Из одного DataGridView выбранную строку записать в другой - C#
Доброго времени суток, долго искал, но так видимо и не найду! Есть форма с DGV - открытая из формы на которой тоже есть DGV, мне...

Как перенести данные из одного DataGridView в другой - C#
как перенести данные из datagridview1 в datagridview2 datagridview2 находится в другом окне


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru