Как разместить несколько таблиц в одном datagridview

Вопрос: В основном у меня есть приложение aС#, которое принимает значения из текстового файла, сохраняет их в списках и передает их в таблицы SQLite. Три таблицы называются abc, t2 и t3 соответственно. Я хочу взять эти таблицы sqlite и представить их в приложении С# в datagridviews. До сих пор мне удалось перенести 1 таблицу (таблица

Вопрос:

В основном у меня есть приложение aС#, которое принимает значения из текстового файла, сохраняет их в списках и передает их в таблицы SQLite.

Три таблицы называются abc, t2 и t3 соответственно.

Я хочу взять эти таблицы sqlite и представить их в приложении С# в datagridviews. До сих пор мне удалось перенести 1 таблицу (таблица abc) на сетку. Я хочу передать все 3 таблицы в gridview.

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

Ниже приведена информация о том, как заполняются 3 таблицы. Более важный код (передача данных в сетку) ниже этого

// TRANSFERING VALUES TO THE SQLITE DB private void button4_Click(object sender, EventArgs e) { // We use these three SQLite objects: SQLiteConnection sqlite_conn; SQLiteCommand sqlite_cmd; SQLiteDataReader sqlite_datareader; // create a new database connection: // Maybe error here — video was different sqlite_conn = new SQLiteConnection(@»Data Source=database.db;Version=3;»); // open the connection: sqlite_conn.Open(); // create a new SQL command: sqlite_cmd = sqlite_conn.CreateCommand(); // Let the SQLiteCommand object know our SQL-Query: sqlite_cmd.CommandText = «CREATE TABLE IF NOT EXISTS ‘abc’ (Seq text, Field text, Desc text, Len text, Dec text, Typ text, Percnt text, Pop text, Alzero text, MaxLen text );»; // Now lets execute the SQL sqlite_cmd.ExecuteNonQuery(); // **** SQLITE TRANSFER SECTION 1 — transfer values from list1 to table1 ***** sqlite_cmd.CommandText = » DELETE FROM abc»; sqlite_cmd.ExecuteNonQuery(); sqlite_cmd.CommandText = «INSERT INTO abc (Seq, Field, Desc, Len, Dec, Typ, Percnt, Pop, Alzero, MaxLen) VALUES (@p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10)»; sqlite_cmd.Parameters.AddWithValue(«@p1», 6); // dummy initial values sqlite_cmd.Parameters.AddWithValue(«@p2», 878); sqlite_cmd.Parameters.AddWithValue(«@p3», 56); sqlite_cmd.Parameters.AddWithValue(«@p4», 6); sqlite_cmd.Parameters.AddWithValue(«@p5», 546); sqlite_cmd.Parameters.AddWithValue(«@p6», 565); sqlite_cmd.Parameters.AddWithValue(«@p7», 568); sqlite_cmd.Parameters.AddWithValue(«@p8», 526); sqlite_cmd.Parameters.AddWithValue(«@p9», 586); sqlite_cmd.Parameters.AddWithValue(«@p10», 526); for (int i = 0; i < NumListValues; i += 10) // Filling SQlite table rows and columns with values from our list { sqlite_cmd.Parameters.AddWithValue(«@p1», list[i]); sqlite_cmd.Parameters.AddWithValue(«@p2», list[i+1]); sqlite_cmd.Parameters.AddWithValue(«@p3», list[i+2]); sqlite_cmd.Parameters.AddWithValue(«@p4», list[i+3]); sqlite_cmd.Parameters.AddWithValue(«@p5», list[i+4]); if (i > 490) break; sqlite_cmd.Parameters.AddWithValue(«@p6», list[i+5]); sqlite_cmd.Parameters.AddWithValue(«@p7», list[i+6]); sqlite_cmd.Parameters.AddWithValue(«@p8», list[i+7]); sqlite_cmd.Parameters.AddWithValue(«@p9», list[i+8]); sqlite_cmd.Parameters.AddWithValue(«@p10», list[i+9]); sqlite_cmd.ExecuteNonQuery(); } // **** SQLITE TRANSFER SECTION 2 — transfer values from list2 to 2nd table ***** sqlite_cmd.CommandText = «CREATE TABLE IF NOT EXISTS ‘t2’ (YYMM text, MinDate text, MaxDate text, TotalTrans text, DebitTrans text, AMOUNTINDOCUMENTCURREN text );»; sqlite_cmd.ExecuteNonQuery(); sqlite_cmd.CommandText = » DELETE FROM t2″; sqlite_cmd.ExecuteNonQuery(); sqlite_cmd.CommandText = «INSERT INTO t2 (YYMM, MinDate, MaxDate, TotalTrans, DebitTrans, AMOUNTINDOCUMENTCURREN ) VALUES (@b1, @b2, @b3, @b4, @b5, @b6)»; sqlite_cmd.Parameters.AddWithValue(«@b1», 6); // dummy initial values sqlite_cmd.Parameters.AddWithValue(«@b2», 878); sqlite_cmd.Parameters.AddWithValue(«@b3», 56); sqlite_cmd.Parameters.AddWithValue(«@b4», 6); sqlite_cmd.Parameters.AddWithValue(«@b5», 546); sqlite_cmd.Parameters.AddWithValue(«@b6», 565); for (int i = 0; i < NumList2Values; i+= 6) // Filling SQlite table rows and columns with values from list2 { sqlite_cmd.Parameters.AddWithValue(«@b1», list2[i]); sqlite_cmd.Parameters.AddWithValue(«@b2», list2[i+1]); sqlite_cmd.Parameters.AddWithValue(«@b3», list2[i+2]); sqlite_cmd.Parameters.AddWithValue(«@b4», list2[i+3]); sqlite_cmd.Parameters.AddWithValue(«@b5», list2[i+4]); sqlite_cmd.Parameters.AddWithValue(«@b6», list2[i+5]); sqlite_cmd.ExecuteNonQuery(); } // Create table to transfer values from list 3 sqlite_cmd.CommandText = «CREATE TABLE IF NOT EXISTS ‘t3’ (YYWW text, MinDate text, MaxDate text, TotalTrans text, DebitTrans text, AMOUNTINDOCUMENTCURREN text );»; sqlite_cmd.ExecuteNonQuery(); sqlite_cmd.CommandText = » DELETE FROM t3″; sqlite_cmd.ExecuteNonQuery(); sqlite_cmd.CommandText = «INSERT INTO t3 (YYWW, MinDate, MaxDate, TotalTrans, DebitTrans, AMOUNTINDOCUMENTCURREN ) VALUES (@c1, @c2, @c3, @c4, @c5, @c6)»; sqlite_cmd.Parameters.AddWithValue(«@c1», 6); // dummy initial values sqlite_cmd.Parameters.AddWithValue(«@c2», 878); sqlite_cmd.Parameters.AddWithValue(«@c3», 56); sqlite_cmd.Parameters.AddWithValue(«@c4», 6); sqlite_cmd.Parameters.AddWithValue(«@c5», 546); sqlite_cmd.Parameters.AddWithValue(«@c6», 565); for (int i = 0; i < NumList3Values ; i+= 6) // Filling SQlite table rows and columns with values from list2 { sqlite_cmd.Parameters.AddWithValue(«@c1», list3[i]); sqlite_cmd.Parameters.AddWithValue(«@c2», list3[i+1]); sqlite_cmd.Parameters.AddWithValue(«@c3», list3[i+2]); sqlite_cmd.Parameters.AddWithValue(«@c4», list3[i+3]); sqlite_cmd.Parameters.AddWithValue(«@c5», list3[i+4]); sqlite_cmd.Parameters.AddWithValue(«@c6», list3[i+5]); sqlite_cmd.ExecuteNonQuery(); }

Ниже описано, как я заполняю datagrid значениями из первой таблицы

string sql = » SELECT * FROM abc»; SQLiteDataAdapter da; DataTable dt; sqlite_cmd.CommandText = sql; //Create New Datatable to fill with data dt = new DataTable(); //Create DataAdapter to fill data in DataTable via Adapter da = new SQLiteDataAdapter(sql, sqlite_conn); da.Fill(dt); // Lets populate the datagrid dataGridView1.DataSource = dt; dataGridView1.Refresh(); Лучший ответ:

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

DataTable allDTs = abc; int rowCount = allDTs.Rows.Count — 1; foreach (DataRow row in t2.Rows) { rowCount = rowCount + 1; allDTs.Rows.Add(); int colCount = -1; foreach (DataColumn col in t2.Columns) { colCount = colCount + 1; if (colCount > allDTs.Columns.Count — 1) allDTs.Columns.Add(col.ColumnName); allDTs.Rows[rowCount][colCount] = row[col]; } } rowCount = allDTs.Rows.Count — 1; foreach (DataRow row in t3.Rows) { rowCount = rowCount + 1; allDTs.Rows.Add(); int colCount = -1; foreach (DataColumn col in t3.Columns) { colCount = colCount + 1; if (colCount > allDTs.Columns.Count — 1) allDTs.Columns.Add(col.ColumnName); allDTs.Rows[rowCount][colCount] = row[col]; } } dataGridView1.DataSource = allDTs;

Этот код исходит из предположения, что вы хотите поместить все столбцы каждого DataTable один за другим (все столбцы abc, затем t2/t3); но алгоритм достаточно ясен, и вы не должны найти никаких проблем, чтобы адаптировать его к вашим конкретным потребностям.

Ответ №1

Ответ на этот вопрос зависит от того, как вы хотите отформатировать данные, которые вы пытаетесь отобразить. Я предполагаю, что вы хотите что-то вроде [abc-col1] [abc-col2] [t2-col1]… [t3-col3]

Быстрый и грязный способ сделать это – использовать “datarow” и объединить данные так, как вы видите, что они вписываются в новый datatable;

datatable combinetable = new datatable(); for (i=0;i<abc.rows.count;i++) { for (j=0;j<abc.columns.count;j++) { datarow newdatarow = new datarow(); newdatarow[j] = abc[i,j]; } combinetable.rows.add(newdatarow); } for (i=0;i<t2.rows.count;i++) { for (j=0;j<t2.columns.count;j++) { datarow newdatarow = new datarow(); newdatarow[j] = t2[i,j]; } combinetable.rows.add(newdatarow); }

просто замените части [i, j] индексами фактических значений, которые вы хотите объединить, и все готово! вам может понадобиться добавить еще один цикл, если у вас есть несколько столбцов на каждый тип данных, который, как я полагаю, вы делаете. После того, как вы создали новый комбинированный тип данных, просто установите его в источник datagridview, как вы делали выше.

Надеюсь, это поможет. Приветствия.

Оцените статью
Добавить комментарий