【问题标题】:displaying multiple datatable in tabcontrol C#在tabcontrol C#中显示多个数据表
【发布时间】:2013-05-30 19:15:42
【问题描述】:

我有一个小程序,它需要一个数据表(从 sql 数据库中获取数据) 然后按字段将其拆分为数据表数组,然后应将其显示在选项卡控件中,每个字段都在其自己的选项卡中

拆分,采用单个数据表并拆分为数据表数组,我认为工作正常

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();
        }

    }

它会打开一个选项卡控件,其中包含适量的选项卡,但其中没有数据

EDIT 1还是不行,显示没有gridview的标签 将其更改为获取数据表数组部分的函数

 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;
    }

EDIT 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;
    }

【问题讨论】:

  • 确保第一个方法调用返回带有数据的datatable[]。
  • 第一种方法你试过了吗?
  • @Steve 我已经尝试在每个拆分表中显示行数...它们不是空的
  • 我想看看你如何调用第一种方法。应该填充 splitDT 数组的那个。你在调用周围有一个 try/catch 空处理程序吗?
  • 我仍然看不到您如何填充传递给方法 splitTable 的 DataTable mainDT。但是,该方法无法正常工作,因为 GetHashCode 返回的数字不能是 0 到 10 之间的数字,需要将某些内容添加到您的 splitDT 数组

标签: c# datagridview datatable tabcontrol


【解决方案1】:

没有架构的 DataTable 上的 ImportRow 不会产生任何结果。

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;
}

此代码仅复制一列,而不是整组列。也许您的代码应该创建一个只有要从中复制的列的数据表。

【讨论】:

  • 用了这个代码,列号OK,在tabcontrol选项卡里还是显示不出来
【解决方案2】:

因为您的 dgw 大小是 0,0 任一设置大小:

dgw.Size = new Size(100, 100);

或将停靠类型设置为填充:

dgw.Dock = System.Windows.Forms.DockStyle.Fill;

【讨论】:

    【解决方案3】:

    在您创建新DataGridViews 的两个地方,您都设置了数据源——这将允许它访问行,但您没有告诉它自己处理列。尝试将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];
    

    【讨论】:

    • 还是空白的灰色datagridview
    • @iakovl2 dt.Columns.Count 是什么?我想知道:这里真的有专栏吗?
    • 我认为问题出在 DataTable 没有用于调用 ImportRow 的架构
    • @Steve - 来自Load 的文档,用于场景“DataTable 没有架构”:“Load 方法根据导入的 IDataReader 的结果集推断架构。”;编辑,啊我明白你的意思 - OP的splitTable方法
    • 但是,刚刚尝试了一个简单的示例,尝试从已经填充的 DataTable 中导入 ImportRow(如这里),并且没有克隆,结果 DataTable.Columns.Count 为零
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多