【问题标题】:Add a second datatable as rowsource of datagridview添加第二个数据表作为 datagridview 的行源
【发布时间】:2013-10-23 00:18:26
【问题描述】:

我有一个 datagridview,我从一个数据表中填充它,然后从 web 服务查询中检索它的数据(针对 SalesForce 云系统)。

本质上,我们希望显示尝试从用户放置的 SalesForce 案例中删除附件的结果,目前我们查询一个名为 case 的 SalesForce XML Web 服务,并且我们希望添加查询的功能第二个名为 credit case 的新 SalesForce 对象。

它从一个名为 case 的对象中获取数据并在 Windows 窗体 datagridview 控件中显示它们的工作正常。

现在我们要添加另一个对象(我们称之为 creditCases),所以我已经设置了查询,添加了另一个包含字段和数据类型的任务对象等等。

填充数据集后,我们使用 gvTaskCases.DataSource = dtCases; 设置 datagridview 的数据源

当然,我现在有第二个数据源(具有不同数量的列)要添加到表中。

如果我对我的新数据表 (gvTaskCases.DataSource = dtcreditCases) 执行此操作,如何阻止它替换现有数据表中的数据?

代码:

gvTaskCases.DataSource = null;

        dtCases.Rows.Clear();

        foreach (task_cases item in cases)
        {
            DataRow drCases = dtCases.NewRow();

            // Then add the new row to the collection.
            drCases["Case ID"] = item.c_Id;
            drCases["Case Number"] = item.c_Number;
            drCases["Case Topic"] = item.c_Topic;
            drCases["Case SubTopic"] = item.c_Subtopic;
            drCases["Account Number"] = item.c_CustomerNumber;
            drCases["Additional Info"] = item.c_AdditionalInfo;
            drCases["Closed Date"] = Convert.ToDateTime(item.c_ClosedDate).ToString("dd/MM/yyyy");
            drCases["Attachment"] = item.c_Attachment;
            drCases["Content Type"] = item.c_ContentType;
            drCases["Detach Status"] = item.c_Status;
            drCases["Document Type"] = item.c_DocumentType;
            drCases["Imaging Directory"] = item.c_ImagingDSXDirectory;
            drCases["Imaging Document"] = item.c_ImagingDocument;

            dtCases.Rows.Add(drCases);
        }

        gvTaskCases.DataSource = dtCases;


        gvTaskCases.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
        gvTaskCases.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;

        foreach (task_creditcases item in creditCases)
            {
            DataRow drCases = dtCases.NewRow();

            // Then add the new row to the collection.
            drCases["Case ID"] = item.c_Id;
            drCases["Case Number"] = item.c_Name; // SalesForece Credit Case Object CASE NUMBER;
            drCases["Account Number"] = item.c_Account__c;
            drCases["Closed Date"] = Convert.ToDateTime(item.c_Closed_Date__c).ToString("dd/MM/yyyy");
            drCases["Attachment"] = item.c_Imaging_Document_Attached__c;
            drCases["Detach Status"] = item.c_Status__c;
            drCases["Document Type"] = item.c_Document_Type__c;
            drCases["Imaging Directory"] = item.c_Directories__c;
            drCases["Imaging Document"] = item.c_Imaging_Document;

            dtCases.Rows.Add(drCases);
            }

        // add the new records:

        // Adjust size & hide columns that aren't needed
        gvTaskCases.Columns[0].Visible = false;
        gvTaskCases.Columns[11].Visible = false;
        gvTaskCases.Columns[12].Visible = false;
        gvTaskCases.Columns[13].Visible = false;

【问题讨论】:

  • 您想在同一个网格中同时显示旧数据和新数据吗?你的新数据的结构如何?
  • 嗯,非常相似,只是可能需要在我的数据表中添加几个空白或空列...
  • @KingKing:我已经编辑了我的问题以提供更多说明,并添加了代码块,在我隐藏一些列的最后是我想要添加第二个数据表的地方
  • 我想另一种方法可能是重用现有的数据表dtcases,但如果可能的话,我想将它们分开
  • 不清楚你想要什么,如果你想保留旧的DataTable,可能你必须保留一些对它的引用并创建一个新的DataTable新旧DataTable,当然会改变reuse的含义。

标签: c# winforms datagridview datatable datasource


【解决方案1】:

您可以使用DataTableMerge 方法。

 ((DataTable) gvTaskCases.DataSource).Merge(dtcreditCases);

另一种方法是保留旧的DataTable,您必须使用一点LINQ 来合并dataTables,如下所示:

gvTaskCases.DataSource = (dtCases.Columns.Count > dtcreditCases.Columns.Count ?
                          dtCases.AsEnumerable().Concat(dtcreditCases.AsEnumerable()) :
                          dtcreditCases.AsEnumerable().Concat(dtCases.AsEnumerable())).CopyToDataTable();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2019-10-11
    • 2015-12-18
    • 2017-02-07
    相关资源
    最近更新 更多