Интерфейс бота. Данные из таблицы в DataGridView и обратно.

IvanVish

Client
Регистрация
19.06.2020
Сообщения
26
Благодарностей
6
Баллы
3
Начитавшись статей о создании привлекательного интерфейса на Windows.Forms решил и в свой проект внедрить данную технологию. Наступил тот этап, когда понадобилось взаимодействовать с таблицами проекта.

Необходимо брать данные из таблицы, выводить в DataGrindView, редактировать и возвращать в таблицу.
Для взятия данных, нашёл вот такой код на форуме:

C#:
//Создаём форму
System.Windows.Forms.Form F = new System.Windows.Forms.Form();
F.Text = "Моя форма";
F.AutoSize=true;


/***************************************************************/

//создаем кнопку
System.Windows.Forms.Button button = new System.Windows.Forms.Button();
button.Text = "Закрыть";
button.Location = new System.Drawing.Point(175,15);
button.Size=new System.Drawing.Size(90, 25);
F.Controls.Add(button);

//*
    //создаем таблицу
System.Windows.Forms.DataGridView dgv = new System.Windows.Forms.DataGridView();
//положение в окне
dgv.Location = new System.Drawing.Point(50,50);
//размер
dgv.AutoSize = true;
dgv.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;


// получаем таблицу, в которой ошибки
var sourceTable = project.Tables["Setting_day"];
lock(SyncObjects.TableSyncer)
{
// получаем количество столбцов в таблице
for(int k=0; k < sourceTable.ColCount; k++)
{
// добавляем столбцы на форму
dgv.Columns.Add(k.ToString(), k.ToString());
}   
};

{
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // добавляем строку
            dgv.Rows.Add(cells);
    }
};

//
//кидаем на форму
F.Controls.Add(dgv);
//


//описываем событие для клика по кнопке
button.Click+= delegate(object sender, System.EventArgs e)
{
        
    F.Dispose(); //Dispose – это уничножение объекта. Есть аналог Close, но Dispose //выгрузит форму из памяти
};

//позиция Формы на экране
F.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
F.ShowDialog();
В доках Microsoft, вроде бы написано, что есть способ проще, но как его реализовать, не разобрался.

По поводу возвращения данных в таблицу. Можно ли это сделать с помощью тех же циклов или есть способ по проще?
Кодер из меня никакой, поэтому прошу помощи у гуру. Думаю сделать из этой статьи что-то вроде мануала, думаю новичкам будет полезно.
 
Последнее редактирование:
  • Спасибо
Реакции: bizzon

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
Молодец. Как сделаешь, не забудь написать статью конкурсную/внеконкурскую, я лайк тебе поставлю :dq:
 

IvanVish

Client
Регистрация
19.06.2020
Сообщения
26
Благодарностей
6
Баллы
3
Жаль, но никто так и не отписался, пришлось самому изобретать велосипед.
Делюсь промежуточным результатом:

Попробовал вносить данные в таблицу с помощью циклов.
C#:
//Создаём форму
System.Windows.Forms.Form F = new System.Windows.Forms.Form();
F.Text = "Моя форма";
F.AutoSize=true;


/***************************************************************/

//создаем кнопку
System.Windows.Forms.Button button = new System.Windows.Forms.Button();
button.Text = "Закрыть";
button.Location = new System.Drawing.Point(175,15);
button.Size=new System.Drawing.Size(90, 25);
F.Controls.Add(button);

//*
    //создаем таблицу
System.Windows.Forms.DataGridView dgv = new System.Windows.Forms.DataGridView();
//положение в окне
dgv.Location = new System.Drawing.Point(50,50);
//размер
dgv.AutoSize = true;
dgv.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;


// получаем таблицу, в которой ошибки
var sourceTable = project.Tables["Setting_day"];
//sourceTable.ColSeparator = ";";
lock(SyncObjects.TableSyncer)
{
// получаем количество столбцов в таблице
for(int k=0; k < sourceTable.ColCount; k++)
{
// добавляем столбцы на форму
dgv.Columns.Add(k.ToString(), k.ToString());
}   
};

{
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // добавляем строку
            dgv.Rows.Add(cells);
    }
};

//
//кидаем на форму
F.Controls.Add(dgv);
//


//описываем событие для клика по кнопке
button.Click+= delegate(object sender, System.EventArgs e)
{
    sourceTable.ColSeparator = ";";
    project.Tables["Setting_day"].Clear();
    lock(SyncObjects.TableSyncer)
{

    for(int k=0; k < dgv.Rows.Count; k++)
{
    string stroke = "";
    for(int i=0; i < dgv.Columns.Count; i++)
    {
       var cells = dgv[i, k].Value.ToString();
       stroke += cells + ";";   
    }
    
    
    project.Tables["Setting_day"].AddRow(stroke);
    
}   
};

};

//позиция Формы на экране
F.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
F.ShowDialog();
Код вроде бы и работает, перезаписывает данные таблицы, но вызывает ошибку.
71854


Вызывает ошибку именно эта строка: var cells = dgv[i, k].Value.ToString();
В чём причина ошибки не разобрался, надеюсь хоть тут кто-нибудь подскажет.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
потому что у тебя заполнено 2 строки, а 3-я пустая. и когда ты пытаешься считать с пустой строки, то попадаешь на null
сделай так и будет работать.
C#:
                var cells ="";
                try { cells = dgv[i, k].Value.ToString(); } catch{}
 
  • Спасибо
Реакции: bizzon

IvanVish

Client
Регистрация
19.06.2020
Сообщения
26
Благодарностей
6
Баллы
3
потому что у тебя заполнено 2 строки, а 3-я пустая. и когда ты пытаешься считать с пустой строки, то попадаешь на null
сделай так и будет работать.
C#:
                var cells ="";
                try { cells = dgv[i, k].Value.ToString(); } catch{}
Да, это помогло, но теперь записывает и пустую строку и добавляет пустой столбец. Не подскажите, почему так происходит?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
насчет столбца , это у тебя логика такая. ты же сам добавляешь разделитель. переработать надо логику формирования столбцов
71860


насчет последней пустой строки, это так работает таблица в винформе. как по мне ,самое простое проверить на пустоту последнюю строку по всем ячейкам и если все пустые , то удалить ее и все.
ну или можно через метки, в catch{} прописать установку метки и break , и добавлять строку в таблицу только если метка нормальная.
 
Последнее редактирование:
  • Спасибо
Реакции: IvanVish

IvanVish

Client
Регистрация
19.06.2020
Сообщения
26
Благодарностей
6
Баллы
3
Ну вот переделал логику, спасибо Phoenix78 за содействие.
Теперь в таблицу не попадают пустые строки и столбцы. Код мне жуть как не нравится, много костылей и проверок, но это работает. Как и говорил ранее, я не кодер. За вечер посмотрел пару уроков по C# и погнал применять знания на практике.
В будущем планирую реализовать решение с помощью массивов, ну а пока буду работать с тем что есть.

Код прилагается:
C#:
//Создаём форму
System.Windows.Forms.Form F = new System.Windows.Forms.Form();
F.Text = "Моя форма";
F.AutoSize=true;


/***************************************************************/

//создаем кнопку
System.Windows.Forms.Button button = new System.Windows.Forms.Button();
button.Text = "Применить";
button.Location = new System.Drawing.Point(175,15);
button.Size=new System.Drawing.Size(90, 25);
F.Controls.Add(button);

//*
    //создаем таблицу
System.Windows.Forms.DataGridView dgv = new System.Windows.Forms.DataGridView();
//положение в окне
dgv.Location = new System.Drawing.Point(50,50);
//размер
dgv.AutoSize = true;
dgv.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;


// получаем таблицу, в которой ошибки
var sourceTable = project.Tables["Setting_day"];
lock(SyncObjects.TableSyncer)
{
// получаем количество столбцов в таблице
for(int k=0; k < sourceTable.ColCount; k++)
{
// добавляем столбцы на форму
dgv.Columns.Add(k.ToString(), k.ToString());
}   
};

{
    for(int i=0; i < sourceTable.RowCount; i++)
    {
        // читаем строку из таблицы (это будет массив ячеек)
        var cells = sourceTable.GetRow(i).ToArray();
        // добавляем строку
            dgv.Rows.Add(cells);
    }
};

//кидаем на форму
F.Controls.Add(dgv);

//описываем событие для клика по кнопке
button.Click+= delegate(object sender, System.EventArgs e)
{
    sourceTable.ColSeparator = ";";
    project.Tables["Setting_day"].Clear();
    lock(SyncObjects.TableSyncer)
{
// получаем количество столбцов в таблице
    for(int k=0; k < dgv.Rows.Count; k++)
{
    int col = 0;
    string end = "";
    string stroke = "";
    for(int i=0; i < dgv.Columns.Count;)
    {
       var cells ="";
       try {
           cells = dgv[i, k].Value.ToString();
           }
       catch{
           if (cells =="")
           {
                  col++;
               if (col == dgv.Columns.Count)
                   end = "end";
           }
       }
       i++;
       if (i == dgv.Columns.Count)
       {
            stroke += cells;   
       }
       else
       {
           stroke += cells + ";";
       }
        
    }
    
    if (end == "") {
        project.Tables["Setting_day"].AddRow(stroke);
    }
    
}   
};
};

//позиция Формы на экране
F.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
F.ShowDialog();
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)