Задать вопрос
alk0v
@alk0v
Сетевой инженер, электронщик, цифровой археолог

Работа с DataGridView?

Вопрос следующий (отписал его на MSDN-овский форум, пока глухо), может кто-то подскажет?


Есть 2 таблицы: Категории, Изделия


Первая таблица содержит индекс и название категории

1, Категория №1

2, Категория №2 и т.д.


Вторая соответственно индекс, название изделия и индекс категории из первой таблицы, т.е. типы полей (в postgresql) — integer, char(64), smallint


Например:

1, Изделие №1, 1

2, Изделие №2, 1

3, Изделие №3, 2


с помощью SQL запроса я заполняю таблицу dtsource (тип DataTable) и указываю ее в качестве источника для DataGridView
grid_devices.DataSource = dtsource;


после чего получаю таблицу:
5356


а хотелось бы вывести в колонке «Категория» комбо-бокс с названиями категорий

можно ли изменить текущий тип столбца? Задать вручную свойство CellType не получилось


Во всех примерах и решениях, которые я находил, в DataGridView вручную добавляли новый столбец через Columns.Add


добавление столбца в DataGridView приведет к изменению связанного с ним DataTable, и после операции Update для внесения изменений в базу postgre будет ошибка, связанная с появлением дополнительного столбца


как вывести вместо цифр названия категорий из таблицы «Категория» с возможностью их изменения через ComboBox?
  • Вопрос задан
  • 9944 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
AFC
@AFC
IMHO так как вы хотите — никак. Вам надо чтобы конкретная колонка была типа DataGridViewComboBoxColumn, а поскольку у вас колонки генерируются автоматически, она сразу DataGridViewTextBoxColumn и сменить не представляется возможным. Т.е. все правильно — сносите лишнюю колонку и добавляйте нужную с правильным маппингом. (Правда мне непонятно, почему изменение вида DataGridView влияет на источник данных, может вы что-то не договариваете ?)
Или же если хочется выстрелить себе в ногу, переопределите методы EditingControlShowing и CellPainting и сами отрисовывайте все что хотите. Неплохая статья на эту тему:
www.rsdn.ru/article/dotnet/DataGridView20part2.xml
Ответ написан
Комментировать
DartAlex
@DartAlex
Я заполнял DataGridView построчно
private void Form_Load(object sender, EventArgs e)
{
    dataGridView1.ColumnCount = 3;
    dataGridView1.Columns[0].Name = "ID";
    dataGridView1.Columns[1].Name = "Наименование";
    dataGridView1.Columns[2].Name = "Категория";
    dataGridView1.AllowUserToAddRows = false;
    dataGridView1.AllowUserToDeleteRows = false;

    string ConnStr = SQLCommands.ConnectionString();
    string Command = "SELECT * FROM [dbo].[Изделия]";
    DataTable Table1 = new DataTable();
    Table1 = SQLGetData(ConnStr, Command).Tables[0];

    foreach (DataRow row in Table1.Rows)
    {
         DataGridViewRow[] dgwrow = new DataGridViewRow[1];
         dgwrow[0] = GetComboBox();
         // Устанавливаем значения из таблицы изделия
         try
         {
             dgwrow[0].Cells[0].Value = row[0].ToString();
             dgwrow[0].Cells[1].Value = row[1].ToString();
             dgwrow[0].Cells[2].Value = row[2].ToString();
         }
         catch { }
         dataGridView1.Rows.Add(dgwrow[0]);
    }
}

private DataGridViewRow GetComboBox()
{
    string ConnStr = "ConnectionString";
    string Command = "SELECT [Name] FROM [dbo].[Категория]";
    DataTable DT = new DataTable();
    DT = SQLGetData(ConnStr, Command).Tables[0];

    DataGridViewRow roww = new DataGridViewRow();
    // создаём комбобокс
    DataGridViewComboBoxCell cell_CB = new DataGridViewComboBoxCell();
    roww.CreateCells(dataGridView1);
    // наполняем из таблицы "категория"
    foreach (DataRow row in DT.Rows)
    {
        Name = row["Name"].ToString();
        cell_CB.Items.AddRange(Name);
    }
    // третья колонка будет комбобокс
    roww.Cells[2] = cell_CB;
    return roww;
}

public static DataSet SQLGetData(string ConnectionString, string commandString)
{
    using (SqlConnection connection = new SqlConnection(ConnectionString))
    {
        DataSet DS = new DataSet();
        DataTable DT = new DataTable("Table1");
        try
        {
            connection.Open();
            SqlCommand command = new SqlCommand(commandString, connection);
            SqlDataReader read = command.ExecuteReader();
            DS.Tables.Add(DT);
            DS.Load(read, LoadOption.PreserveChanges, DS.Tables[0]);
                   
        }
        catch (SqlException e)
        {
            System.Windows.Forms.MessageBox.Show(e.Message);
        }
        finally
        {
            connection.Close();
        }
        return DS;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы