【问题标题】:Splitting DataTable and converting to HTML Table in Asp.Net在 Asp.Net 中拆分 DataTable 并转换为 HTML Table
【发布时间】:2015-08-25 12:08:23
【问题描述】:

我有一张表,它从数据表转换为 html 表以便发送电子邮件。

UserName            EmailID                    Hours

Name             something@example.com           23
Name             something@example.com           65
Name             something@example.com           30
Name             something@example.com           68
Name             something@example.com           29
Name             something@example.com           70

我想从这个 DataTable 进行修改。我想分成两组(数据表或 HTML 表),比如 40 小时以下是一张表,60 小时以上是一张表。然后想在电子邮件中作为两个 html 表发送。

 if ((result.Rows[k]["Hours"]) != null && (result.Rows[k]["Hours"]) != "")
            {
                if (Convert.ToDouble(result.Rows[k]["Hours"].ToString()) >= itemHours || Convert.ToDouble(result.Rows[k]["Hours"].ToString()) <= 60)
                {
                    result.Rows[k].Delete();
                    k = k - 1;
                }
            }
        }
        result.AcceptChanges();

result 是要转换为 HTML 表的最终 DataTable。在发送邮件之前必须像我之前所说的那样转换为两个 HTMl 表。

【问题讨论】:

  • 你尝试了什么?请向我们展示一些您自己尝试实现此目标的代码。
  • 结果数据表包含小时数小于 40 且大于 60 的行。现在想按照我在描述中所说的进行拆分
  • 我不明白如果你声明两个名称为 dtAbove60 和 dtAbove40 的数据表,然后在循环中,使用条件来填充它们,是否会有一些困难。

标签: c# asp.net datatable


【解决方案1】:

请尝试以下代码 sn-p。

DataTable dt = new DataTable();
dt.Columns.Add("UserName", typeof(System.String));
dt.Columns.Add("EmailID", typeof(System.String));
dt.Columns.Add("Hours", typeof(System.Int32));

dt.Rows.Add("user1", "abc@abc1.com", 10);
dt.Rows.Add("user2", "abc@abc2.com", 20);
dt.Rows.Add("user3", "abc@abc3.com", 30);
dt.Rows.Add("user4", "abc@abc4.com", 40);
dt.Rows.Add("user5", "abc@abc5.com", 50);
dt.Rows.Add("user6", "abc@abc6.com", 60);
dt.Rows.Add("user7", "abc@abc7.com", 70);
dt.Rows.Add("user8", "abc@abc8.com", 80);
dt.Rows.Add("user9", "abc@abc9.com", 90);
dt.Rows.Add("user10", "aaa@aaa10.com", 100);

string strTable1 = "<table>";
string strTable2 = "<table>";

for (int i = 0; i < dt.Rows.Count; i++)
{
    int hours = 0;
    int.TryParse(dt.Rows[i]["Hours"].ToString(), out hours);
    if (hours > 60)
    {
        strTable1 += "<tr><td>" + dt.Rows[i]["UserName"] + "</td><td>" + dt.Rows[i]["EmailID"] + "</td><td>" + dt.Rows[i]["Hours"] + "</td></tr>";
    }
    else if (hours < 40)
    {
        strTable2 += "<tr><td>" + dt.Rows[i]["UserName"] + "</td><td>" + dt.Rows[i]["EmailID"] + "</td><td>" + dt.Rows[i]["Hours"] + "</td></tr>";
    }
}

strTable1 += "</table>"; // Above 60 hours
strTable2 += "</table>"; // Below 40 hours

如果有任何问题,请告诉我。

【讨论】:

    【解决方案2】:

    好吧,您可以尝试使用Linq。当你想做这类事情时,使用数据表会变得非常混乱。

    这只是一个(人为的)示例(控制台应用程序):

     var people = new List<People>()
                {
                    new People { Name = "Mark", Email = "someone@example.com", Hours = 20 },
                    new People { Name = "Test1", Email = "someone@example.com", Hours = 30 },
                    new People { Name = "Test2", Email = "someone@example.com", Hours = 40 },
                    new People { Name = "Test3", Email = "someone@example.com", Hours = 20 },
                    new People { Name = "Test4", Email = "someone@example.com", Hours = 30 },
                    new People { Name = "Test5", Email = "someone@example.com", Hours = 45 },
                    new People { Name = "Test6", Email = "someone@example.com", Hours = 46 },
                    new People { Name = "Test7", Email = "someone@example.com", Hours = 45 },
                    new People { Name = "Test8", Email = "someone@example.com", Hours = 50 }
                };
    
                var dt = ConvertToDatatable(people);
                var over40 = from s in dt.AsEnumerable()     //We want people over 40 hours
                             where s.Field<int>("Hours") >= 40
                             select s;
                //Stuff this back in a DataTable
                var dtOver40 = ConvertToDatatable(over40.ToList());
    
                //Under 40
                 var under40 = from s in dt.AsEnumerable()
                          where s.Field<int>("Hours") < 40
                          select s;
                var dtUnder40 = ConvertToDatatable(under40.ToList());
    
                foreach(var folks in over40)
                {
                    Console.WriteLine(folks[0]);
                    Console.WriteLine(folks[1]);
                    Console.WriteLine(folks[2]);
                }
    
                Console.ReadLine();
    

    这可能看起来有点陌生,但为了建立一个快速、有效的示例,我使用静态方法将 List&lt;T&gt; 转换为 DataTable:

     private static DataTable ConvertToDatatable<T>(List<T> data)
            {
                PropertyDescriptorCollection props =
                    TypeDescriptor.GetProperties(typeof(T));
                DataTable table = new DataTable();
                for (int i = 0; i < props.Count; i++)
                {
                    PropertyDescriptor prop = props[i];
                    if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                        table.Columns.Add(prop.Name, prop.PropertyType.GetGenericArguments()[0]);
                    else
                        table.Columns.Add(prop.Name, prop.PropertyType);
                }
                object[] values = new object[props.Count];
                foreach (T item in data)
                {
                    for (int i = 0; i < values.Length; i++)
                    {
                        values[i] = props[i].GetValue(item);
                    }
                    table.Rows.Add(values);
                }
                return table;
            }
    

    【讨论】:

      【解决方案3】:

      这是使用 Linq 的另一种选择

      //First I need to fill the DataTable you have
      DataTable dt = new DataTable();
      dt.Columns.Add("UserName", typeof(System.String));
      dt.Columns.Add("EmailID", typeof(System.String));
      dt.Columns.Add("Hours", typeof(System.Int32));
      
      dt.Rows.Add("user1", "abc@abc1.com", 10);
      dt.Rows.Add("user2", "abc@abc2.com", 20);
      dt.Rows.Add("user3", "abc@abc3.com", 30);
      dt.Rows.Add("user4", "abc@abc4.com", 40);
      dt.Rows.Add("user5", "abc@abc5.com", 50);
      dt.Rows.Add("user6", "abc@abc6.com", 60);
      dt.Rows.Add("user7", "abc@abc7.com", 70);
      dt.Rows.Add("user8", "abc@abc8.com", 80);
      dt.Rows.Add("user9", "abc@abc9.com", 90);
      dt.Rows.Add("user10", "aaa@aaa10.com", 100);
      
      //Get the rows less than 40 with Linq and format them as HTML rows
      string[] lessThan40 = (from row in dt.AsEnumerable()
                        where Convert.ToInt32(row["Hours"]) < 40
                        select string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>",
                                      row["UserName"], row["EmailID"], row["Hours"])).ToArray();
      
      //Get the rows more than 60 with Linq and format them as HTML rows
      string[] moreThan60 = (from row in dt.AsEnumerable()
                        where Convert.ToInt32(row["Hours"]) > 60
                        select string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td></tr>",
                                      row["UserName"], row["EmailID"], row["Hours"])).ToArray();
      
      //Finally just add the HTML rows generated to the HTML Table element
      string htmlTables = string.Format("<table>{0}</table><br><br><table>{1}</table>",
                          string.Join(string.Empty, lessThan40),
                          string.Join(string.Empty, moreThan60));
      

      【讨论】:

        猜你喜欢
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 2023-04-03
        • 2018-02-04
        • 1970-01-01
        相关资源
        最近更新 更多