簡體   English   中英

如何用字符串更新 DataTable 的特定列字段值?

[英]How to update the particular column field value of DataTable with a string?

我正在使用以下代碼將日期從表中提取到IEnumerable中:

 IEnumerable<DateTime> obj = ds.Tables[0].AsEnumerable().Select(x => x.Field<DateTime>("WeekOffDays")).ToArray();

obj 顯示以下數據: 2020-01-04 12:00:00 AM 2020-01-05 12:00:00 AM 2020-01-18 12:00:00 AM 2020-01-19 12:00:00是

這些也是 pivot 表的日期:

在此處輸入圖像描述

我想要的是,與上表匹配的變量obj中的所有日期都應具有字符串值為“WO”。

我有這個:

    public DataTable GetHolidays(DataSet ds, List<string> dates, DataTable dt)
    {

    for (int i = 0; i <= dates.Count - 1; i++)
    {

        bool weekOff = ds.Tables[0].AsEnumerable().Any(x => dates.Contains(x.Field<DateTime>("WeekOff").ToString("yyyy-MM-dd")));

        //select the dates available
        IList<DateTime> obj = ds.Tables[0].AsEnumerable().Select(x => x.Field<DateTime>("WeekOff")).ToArray();

        if (weekOff)
        {
            // what to write to update the datatable value with "WO" for dates in **obj**


            //string wo = dates[i].ToString();
            //dt.Columns.Cast<DataColumn>().Where(r => r.ColumnName == wo).FirstOrDefault().DefaultValue = "WO";  // this doesn't work. No errors, but the field value doesn't get updated with WO


        }

    }

該行:dt.Columns.Cast().Where(r => r.ColumnName == wo).FirstOrDefault().DefaultValue = "WO";

這不起作用。 沒有錯誤,但數據表沒有用字符串 WO 更新

嘗試如下代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Division", typeof(string));
            dt.Columns.Add("Date", typeof(DateTime));
            dt.Columns.Add("Value", typeof(int));

            dt.Rows.Add(new object[] { 1, "abc", "A", new DateTime(2020, 1, 2), 2 });
            dt.Rows.Add(new object[] { 2, "abc", "B", new DateTime(2020, 1, 3), 3 });
            dt.Rows.Add(new object[] { 3, "def", "C", new DateTime(2020, 1, 4), 5 });
            dt.Rows.Add(new object[] { 4, "def", "A", new DateTime(2020, 1, 5), 6 });
            dt.Rows.Add(new object[] { 5, "ghi", "B", new DateTime(2020, 1, 6), 5 });
            dt.Rows.Add(new object[] { 6, "ghi", "C", new DateTime(2020, 1, 7), 4 });
            dt.Rows.Add(new object[] { 7, "klm", "D", new DateTime(2020, 1, 8), 3 });
            dt.Rows.Add(new object[] { 8, "klm", "A", new DateTime(2020, 1, 2), 4 });
            dt.Rows.Add(new object[] { 9, "123", "A", new DateTime(2020, 1, 5), 7 });
            dt.Rows.Add(new object[] { 10, "456", "A", new DateTime(2020, 1, 2), 4 });
            dt.Rows.Add(new object[] { 11, "789", "F", new DateTime(2020, 1, 7), 3 });
            dt.Rows.Add(new object[] { 12, "345", "A", new DateTime(2020, 1, 2), 2 });
            dt.Rows.Add(new object[] { 13, "794", "D", new DateTime(2020, 1, 9), 5 });
            dt.Rows.Add(new object[] { 14, "stu", "A", new DateTime(2020, 1, 12), 7 });
            dt.Rows.Add(new object[] { 15, "afg", "E", new DateTime(2020, 1, 12), 8 });
            dt.Rows.Add(new object[] { 16, "hij", "A", new DateTime(2020, 1, 2), 1 });

            DataTable pivot = new DataTable();
            pivot.Columns.Add("Name", typeof(string));
            pivot.Columns.Add("Division", typeof(string));

            DateTime[] dates = dt.AsEnumerable().Select(x => x.Field<DateTime>("Date")).OrderBy(x => x).Distinct().ToArray();

            foreach (DateTime date in dates)
            {
                pivot.Columns.Add(date.Date.ToString(), typeof(int));
            }

            var groups = dt.AsEnumerable().GroupBy(x => new { name = x.Field<string>("name"), division = x.Field<string>("Division") }).ToList();

            foreach (var group in groups)
            {
                DataRow newRow = pivot.Rows.Add();
                newRow["Name"] = group.Key.name;
                newRow["Division"] = group.Key.division;
                foreach (DataRow row in group)
                {
                    string date = row.Field<DateTime>("Date").Date.ToString();
                    newRow[date] = row.Field<int>("Value");

                }


            }

        }
    }
}

評論:我發布的代碼有很多變化。

1)我將結果放入一個新表“var groups = dt.AsEnumerable().

2)我還假設每個單元格只有一個值。 我使用 integer 作為日期列中的單元格值。 如果每個單元格有多個值,則將行更改為 newRow[date] += row.Field("Value"); 如果您有字符串,請進行以下更改

a) dt.Columns.Add("Value", typeof(string));

b) pivot.Columns.Add(date.Date.ToString(), typeof(string));

c) newRow[date] = string.Join(",",newRow[date].Concat(row.Field("Value")));

3)我只將存在的日期放入 pivot 表中。 您可以使用以下代碼輸入每個日期

            DateTime startDate = new DateTime(2020, 1, 4);
            DateTime endDate = new DateTime(2020, 2, 4);
            for(DateTime date = startDate; date <= endDate; date = date.AddDays(1))
            {
                pivot.Columns.Add(date.Date.ToString(), typeof(int));  //or change to string
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM