试图从一个数据表中检索数据,我试图根据某些条件使用 C# 填充另一个数据表,但我无法这样做
trying to retrieve data from one datatable and i am trying to populate another datatable based on certain conditions using C# i am unable to do so
我正在使用下面的代码。
我在 dta 中得到数据 table 数据正常。
现在,在 GCSdt1 中,我想要填充数据,以便为每位员工显示该月的列中的用户班次。我的意思是 table 应该看起来像
Name | 6-1-2015|6-2-2015|.........|6-30-2015
下一行应该在名字下面它应该显示名字,在 6-1-2015 下它应该显示他在 6-1-2015
的班次
下面是我的代码。我能够填充第一个数据 table 并为网格创建列。现在我卡住了。
SqlDataReader GCSrdr;
SqlCommand GCScmd;
DataRow GCSdrow;
DataView GTView;
DataTable GCSdt = new DataTable();
DataTable GCSdt1 = new DataTable();
SqlConnection GCScon = new SqlConnection("MYCOnnection");
DateTime dt = DateTime.Today.Date;
static DateTime today = DateTime.Today;
DataColumn[] day1;
static int daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);
DateTime startOfMonth = new DateTime(today.Year, today.Month, 1);
DateTime endOfMonth = new DateTime(today.Year, today.Month, daysInMonth);
public DataTable MonthView()
{
string gcsCmdSelect = "Select S.Emp_Name,S.User_Shift,S.Shift_Emp_Status,S.Shift_Date from Shift_Details S INNER JOIN Emp_Details E ON S.EMP_Name=E.Employee_Name where (S.Shift_Date >='" + startOfMonth + "') and (S.Shift_Date <='" + endOfMonth + "') ORDER BY S.Emp_Name";
if (GCScon.State == ConnectionState.Closed)
{
GCScon.Open();
}
SqlDataAdapter da = new SqlDataAdapter(gcsCmdSelect, GCScon);
DataTable dta = new DataTable();
da.Fill(dta);
/////// Results fine
DataView ndtv = new DataView(dta);
GCSdt = ndtv.ToTable(true,dta.Columns[0].ToString());
GCSdt1.Columns.Add("Name");
for (int i = 1; i <=daysInMonth; i++)
{
GCSdt1.Columns.Add(startOfMonth.ToShortDateString());
startOfMonth = startOfMonth.AddDays(1);
}
GCSdt1.Rows.Add();
////////////////////卡在此处/////////////////////
return GCSdt1;
}
}
试试下面的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataTable dta = new DataTable();
dta.Columns.Add("Emp_Name", typeof(string));
dta.Columns.Add("User_Shift", typeof(string));
dta.Columns.Add("Shift_Emp_Status", typeof(string));
dta.Columns.Add("Shift_Date", typeof(DateTime));
dta.Columns["Shift_Date"].AllowDBNull = true;
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/1/15") });
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/2/15") });
dta.Rows.Add(new object[] { "John", "Afternoon", "abc", DateTime.Parse("1/3/15") });
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/14/15") });
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/15/15") });
dta.Rows.Add(new object[] { "John", "Afternoon", "abc", DateTime.Parse("1/26/15") });
dta.Rows.Add(new object[] { "Mary", "Morning", "abc", DateTime.Parse("1/15/15") });
dta.Rows.Add(new object[] { "Mary", "Morning", "abc", DateTime.Parse("1/22/15") });
dta.Rows.Add(new object[] { "Mary", "Evening", "abc", DateTime.Parse("1/23/15") });
dta.Rows.Add(new object[] { "Mary", "Afternoon", "abc", DateTime.Parse("1/24/15") });
dta.Rows.Add(new object[] { "Mary", "Morning", "abc", null });
dta.Rows.Add(new object[] { "Mary", "Evening", "abc", DateTime.Parse("1/26/15") });
DataTable displayTable = new DataTable();
DateTime firstDayOfMonth = DateTime.Parse("1/1/15");
int numberOfDaysInMonth = firstDayOfMonth.AddMonths(1).AddDays(-1).Day;
DateTime dayCounter = firstDayOfMonth;
displayTable.Columns.Add("Name", typeof(string));
for (int i = 0; i < numberOfDaysInMonth; i++)
{
displayTable.Columns.Add(dayCounter.ToShortDateString(), typeof(string));
dayCounter = dayCounter.AddDays(1);
}
var results = dta.AsEnumerable()
.GroupBy(x => x.Field<string>("Emp_Name"))
.Select(x => new
{
name = x.Select(y => y.Field<string>("Emp_Name")).FirstOrDefault(),
shifts = x.Select(y => y.Field<string>("User_Shift")).ToList(),
days = x.Select(y => y.Field<object>("Shift_Date")).ToList()
}).ToList();
foreach (var row in results)
{
string[] shifts = new string[numberOfDaysInMonth + 1];
shifts[0] = row.name;
for (int i = 0; i < row.days.Count; i++)
{
if (row.days[i] != null)
{
int dayOfMonth = ((DateTime)(row.days[i])).Day;
string shift = row.shifts[i];
shifts[dayOfMonth] = shift;
}
}
DataRow shiftRow = displayTable.Rows.Add(shifts);
}
dataGridView1.DataSource = displayTable;
}
}
}
我正在使用下面的代码。
我在 dta 中得到数据 table 数据正常。
现在,在 GCSdt1 中,我想要填充数据,以便为每位员工显示该月的列中的用户班次。我的意思是 table 应该看起来像
Name | 6-1-2015|6-2-2015|.........|6-30-2015
下一行应该在名字下面它应该显示名字,在 6-1-2015 下它应该显示他在 6-1-2015
下面是我的代码。我能够填充第一个数据 table 并为网格创建列。现在我卡住了。
SqlDataReader GCSrdr;
SqlCommand GCScmd;
DataRow GCSdrow;
DataView GTView;
DataTable GCSdt = new DataTable();
DataTable GCSdt1 = new DataTable();
SqlConnection GCScon = new SqlConnection("MYCOnnection");
DateTime dt = DateTime.Today.Date;
static DateTime today = DateTime.Today;
DataColumn[] day1;
static int daysInMonth = DateTime.DaysInMonth(today.Year, today.Month);
DateTime startOfMonth = new DateTime(today.Year, today.Month, 1);
DateTime endOfMonth = new DateTime(today.Year, today.Month, daysInMonth);
public DataTable MonthView()
{
string gcsCmdSelect = "Select S.Emp_Name,S.User_Shift,S.Shift_Emp_Status,S.Shift_Date from Shift_Details S INNER JOIN Emp_Details E ON S.EMP_Name=E.Employee_Name where (S.Shift_Date >='" + startOfMonth + "') and (S.Shift_Date <='" + endOfMonth + "') ORDER BY S.Emp_Name";
if (GCScon.State == ConnectionState.Closed)
{
GCScon.Open();
}
SqlDataAdapter da = new SqlDataAdapter(gcsCmdSelect, GCScon);
DataTable dta = new DataTable();
da.Fill(dta);
/////// Results fine
DataView ndtv = new DataView(dta);
GCSdt = ndtv.ToTable(true,dta.Columns[0].ToString());
GCSdt1.Columns.Add("Name");
for (int i = 1; i <=daysInMonth; i++)
{
GCSdt1.Columns.Add(startOfMonth.ToShortDateString());
startOfMonth = startOfMonth.AddDays(1);
}
GCSdt1.Rows.Add();
////////////////////卡在此处/////////////////////
return GCSdt1;
}
}
试试下面的代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DataTable dta = new DataTable();
dta.Columns.Add("Emp_Name", typeof(string));
dta.Columns.Add("User_Shift", typeof(string));
dta.Columns.Add("Shift_Emp_Status", typeof(string));
dta.Columns.Add("Shift_Date", typeof(DateTime));
dta.Columns["Shift_Date"].AllowDBNull = true;
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/1/15") });
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/2/15") });
dta.Rows.Add(new object[] { "John", "Afternoon", "abc", DateTime.Parse("1/3/15") });
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/14/15") });
dta.Rows.Add(new object[] { "John", "Morning", "abc", DateTime.Parse("1/15/15") });
dta.Rows.Add(new object[] { "John", "Afternoon", "abc", DateTime.Parse("1/26/15") });
dta.Rows.Add(new object[] { "Mary", "Morning", "abc", DateTime.Parse("1/15/15") });
dta.Rows.Add(new object[] { "Mary", "Morning", "abc", DateTime.Parse("1/22/15") });
dta.Rows.Add(new object[] { "Mary", "Evening", "abc", DateTime.Parse("1/23/15") });
dta.Rows.Add(new object[] { "Mary", "Afternoon", "abc", DateTime.Parse("1/24/15") });
dta.Rows.Add(new object[] { "Mary", "Morning", "abc", null });
dta.Rows.Add(new object[] { "Mary", "Evening", "abc", DateTime.Parse("1/26/15") });
DataTable displayTable = new DataTable();
DateTime firstDayOfMonth = DateTime.Parse("1/1/15");
int numberOfDaysInMonth = firstDayOfMonth.AddMonths(1).AddDays(-1).Day;
DateTime dayCounter = firstDayOfMonth;
displayTable.Columns.Add("Name", typeof(string));
for (int i = 0; i < numberOfDaysInMonth; i++)
{
displayTable.Columns.Add(dayCounter.ToShortDateString(), typeof(string));
dayCounter = dayCounter.AddDays(1);
}
var results = dta.AsEnumerable()
.GroupBy(x => x.Field<string>("Emp_Name"))
.Select(x => new
{
name = x.Select(y => y.Field<string>("Emp_Name")).FirstOrDefault(),
shifts = x.Select(y => y.Field<string>("User_Shift")).ToList(),
days = x.Select(y => y.Field<object>("Shift_Date")).ToList()
}).ToList();
foreach (var row in results)
{
string[] shifts = new string[numberOfDaysInMonth + 1];
shifts[0] = row.name;
for (int i = 0; i < row.days.Count; i++)
{
if (row.days[i] != null)
{
int dayOfMonth = ((DateTime)(row.days[i])).Day;
string shift = row.shifts[i];
shifts[dayOfMonth] = shift;
}
}
DataRow shiftRow = displayTable.Rows.Add(shifts);
}
dataGridView1.DataSource = displayTable;
}
}
}