Отображение нескольких данных в tabcontrol C#
У меня есть небольшая программа, которая берет datatable (берет данные из базы данных sql), затем разбивает его на массив datatable по полю и затем отображает его в tabcontrol, каждое поле в своей вкладке
расщепление, принимает один datatable и разбивает на массив datatable, я думаю, что работает отлично
public DataTable[] splitTable(DataTable mainDT,string columnName)
{
int tmp=0;
DataTable[] splitDT = new DataTable[11];
for (int i=0;i<11;i++)
splitDT[i]=new DataTable();
foreach (DataRow row in mainDT.Rows)
{
tmp = row[columnName].GetHashCode();
splitDT[tmp].ImportRow(row);
}
return splitDT;
}
вот проблемная часть
public Display(string Name, string rname, DataTable[] left,int tabNum)
{
InitializeComponent();
TabPage tp;
DataGridView dgw;
lLeftTable.Text = Name;
for (int i = 0; i < tabNum;i++ )
{
tp = new TabPage(""+i);
dgw = new DataGridView();
dgw.DataSource = left[i];
tp.Controls.Add(dgw);
tbcLeftPages.Controls.Add(tp);
tbcLeftPages.Refresh();
}
}
он открывает tabcontrol с нужным количеством вкладок, но без данных в них
РЕДАКТИРОВАТЬ 1 все еще не очень хорошо, показывать вкладки без вида сетки превратил его в функцию, которая получает части массива данных
public void addDGWtoTab(DataTable dt,string side,int num)
{
MessageBox.Show("table:" + side + " bucket:" + num + "rows:" + dt.Rows.Count);
DataGridView dgw = new DataGridView();
TabPage tp = new TabPage();
//data grid view
dgw.Name = "dgv" + num;
dgw.AutoSize = true;
dgw.Dock = DockStyle.Fill;
//tab page
tp.Name = "tp" + num;
tp.Text = "Bucket " + num;
tp.Tag = dt.Rows.Count;
tp.TabIndex = num;
if (side == "left")
tbcLeftPages.Controls.Add(tp);
else tbcRightPages.Controls.Add(tp);
dgw.DataSource = dt;
tp.Controls.Add(dgw);
}
РЕДАКТИРОВАТЬ 2 добавил spitDT
public DataTable[] splitTable(DataTable mainDT,string columnName,int mod)
{
DataTable[] splitDT = new DataTable[11];
for (int i=0;i<11;i++)
splitDT[i]=new DataTable();
int splitINT;
int tmp=0;
foreach (DataRow row in mainDT.Rows)
{
splitINT = row[columnName].GetHashCode();
tmp = splitINT % mod;
splitDT[tmp].ImportRow(row);
}
return splitDT;
}
РЕДАКТИРОВАТЬ 3 разделить с сообщениями
public DataTable[] splitTable(DataTable mainDT,string columnName,int mod)
{
DataTable[] splitDT = new DataTable[11];
for (int i=0;i<11;i++)
splitDT[i]=new DataTable();
int splitINT;
int tmp=0;
foreach (DataRow row in mainDT.Rows)
{
splitINT = row[columnName].GetHashCode();
tmp = splitINT % mod;
splitDT[tmp].ImportRow(row);
MessageBox.Show("value:" + row[columnName].ToString() + "splitINT:" + splitINT + "mod:" + mod +
" to table:" + tmp);
MessageBox.Show("" + splitDT[tmp].Rows.Count);
}
return splitDT;
}
3 ответа
ImportRow в DataTable без схемы не дает никакого результата.
public DataTable[] splitTable(DataTable mainDT,string columnName,int mod)
{
DataTable[] splitDT = new DataTable[11];
for (int i=0;i<11;i++)
{
// Create a datatable with the same structure (schema) of the source table
splitDT[i] = mainDT.Clone();
}
int splitINT;
int tmp=0;
foreach (DataRow row in mainDT.Rows)
{
splitINT = row[columnName].GetHashCode();
tmp = splitINT % mod;
splitDT[tmp].ImportRow(row);
}
return splitDT;
}
Этот код копирует только столбец, а не весь набор столбцов. Возможно, ваш код должен создать таблицу данных только с столбцом для копирования.
В обоих местах, где вы создаете новый DataGridView
s, вы установили источник данных - который позволит ему получать доступ к строкам, но вы не сказали ему обрабатывать сами столбцы. Попробуйте установить AutoGenerateColumns
в true
прежде чем установить DataSource
; т.е.
DataGridView dgw = new DataGridView();
TabPage tp = new TabPage();
//data grid view
dgw.AutoGenerateColumns = true; // <====== added this line
dgw.Name = "dgv" + num;
dgw.AutoSize = true;
dgw.Dock = DockStyle.Fill;
// ... some here not shown
dgw.DataSource = dt;
а также:
dgw = new DataGridView();
dgw.AutoGenerateColumns = true; // <====== added this line
dgw.DataSource = left[i];
Потому что ваш dgw
размер 0,0 либо заданный размер:
dgw.Size = new Size(100, 100);
или установите тип док-станции для заполнения:
dgw.Dock = System.Windows.Forms.DockStyle.Fill;