带有记录的 DataTable 自定义

Posted

技术标签:

【中文标题】带有记录的 DataTable 自定义【英文标题】:DataTable customization with records 【发布时间】:2020-04-18 23:19:15 【问题描述】:

我有 1 个具有 10 行的数据表,而具有 8 个列表项的列表框包含来自数据表的 6 条记录和 2 条新记录。

我想更新 DataTable,使 6 条记录保持原样,并从 DataTable 中删除剩余的 4 条记录,并从 DataTable 中的 ListBox 中添加 2 个新添加的条目。

我尝试的是从 DataTable 循环 ListBox 记录并创建匹配记录列表。

string impactedTC;
List<int> index = new List<int>();
// This retruns my dataset having 10 records           
DataTable dttable = GetImpactedTestCaseDetailsToUpdateStatus().Tables[0];

for (int i = 0; i < ListBox1.Items.Count; i++)

    int count = 0;

    string dTestCase = ListBox1.Items[i].Text;
    foreach (DataRow dtRow in dttable.Rows)
    
        impactedTC = dtRow["TestCaseName"].ToString();
        if (impactedTC == dTestCase)
        
            index.Add(count);
        
        count++;
    

【问题讨论】:

请提供示例代码,以便我们可以使用。 @djsoteric 我创建了与数据表记录匹配的索引列表。现在我想从数据表中删除其余的记录。 您应该能够遍历记录并在您确定不属于的行之后在一个事务中删除它们。我会用 LINQ 来做,而不是写一个循环。见***.com/questions/5648339/… @djsoteric 你能用你的逻辑更新上面的代码吗? 您想将语句 count++ 放在 if 语句中,这样它只会在您匹配 TestCaseName 时递增。 【参考方案1】:

您可以使用Ling:

保留 6 行并从 DataTable 中删除剩余的 4 行:

//Assuming the names are DataTable1 and ListBox1.
var rowsToRemove = from r in DataTable1.Rows.Cast<DataRow>()
        where listBox1.Items
        .Cast<ListItem>()
        .Aggregate(0, (n, li) => li.Text.ToLower() == r.Field<string>("TestCaseName").ToLower() ? n + 1 : n) == 0
        select r;

从 ListBox 中获取新项目:

var newItems = from li in listBox1.Items.Cast<ListItem>()
                where DataTable1.Rows
                .Cast<DataRow>()
                .Aggregate(0, (n, r) => r.Field<string>("TestCaseName").ToLower() == li.Text.ToLower() ? n + 1 : n) == 0
                select li;

最后更新DataTable:

rowsToRemove.ToList().ForEach(r => DataTable1.Rows.Remove(r));
newItems.ToList().ForEach(li => DataTable1.Rows.Add(li.Text)); //or maybe li.Value

重要

您可能需要将上述代码中的任何li.Text 替换为li.Value,这取决于如何创建ListItem 对象。详情请查看this。

【讨论】:

谢谢@JQSOFT 我确实有 ListItem 很难将新项目添加到数据表中。你能帮我解决这个问题吗? 'System.Web.UI.WebControls.ListItem' 键入 'System.IConvertible' 错误在执行过程中发生。你能帮我吗? @prashanatchaudhar 当然它会抛出该异常,因为它是不同的类型。您必须通过添加正确的标签、项目的类型等来使您的帖子更加清晰。无论如何,如果您更改类型并调用正确的属性,则相同的逻辑将起作用。试试修改后的代码, @prashanatchaudhar 还要检查你真正需要得到什么,是ListItem.Text 属性还是ListItem.Value? ListItem.Text 是必需的。我是 linq 的新手,我仍在为此苦苦挣扎。你能帮我写代码吗? @JQSOFT @prashanatchaudhar 我刚刚做了队友,检查代码。我用ListItem 替换了string,并删除了替代功能,因为它在这里不起作用。试试看,告诉我你得到了什么。

以上是关于带有记录的 DataTable 自定义的主要内容,如果未能解决你的问题,请参考以下文章

ngx-datatable - 带有操作按钮的自定义列

带有服务器端的数据表自定义过滤

自定义过滤使用Button for Datatable

使用带有引导程序的 dataTables 将自定义控件附加到 dom

DATATABLE自定义序号

DataTable:td内日期的自定义排序