C# 带有数据源的asp日历在表中不存在的日期上没有差异
因此,基本上它是一个asp日历,显示员工申请的休假次数,每次有人申请休假时,槽号都会下降。这一切都很好,但我正试图从数据库中设置可用的插槽。因此,我在table setshrinkage上有一个数据列,它获取为某些日期设置的人员编制,并尝试从批准的带有人员编制的表中减去特定日期的人数。编制表如下所示 例如,在2018年8月27日的日历中,我想从批准的表格中减去9减去2018年8月27日的计数。但是当我尝试这个方法时,我得到了一个错误的对象引用,没有设置为对象的实例。我理解这是因为剩余日期的数据为空。那我怎么才能让它工作呢?提前谢谢C# 带有数据源的asp日历在表中不存在的日期上没有差异,c#,mysql,C#,Mysql,因此,基本上它是一个asp日历,显示员工申请的休假次数,每次有人申请休假时,槽号都会下降。这一切都很好,但我正试图从数据库中设置可用的插槽。因此,我在table setshrinkage上有一个数据列,它获取为某些日期设置的人员编制,并尝试从批准的带有人员编制的表中减去特定日期的人数。编制表如下所示 例如,在2018年8月27日的日历中,我想从批准的表格中减去9减去2018年8月27日的计数。但是当我尝试这个方法时,我得到了一个错误的对象引用,没有设置为对象的实例。我理解这是因为剩余日期的数据为
class Sample
{
public DateTime Date { get; set; }
public int SlotAvailable { get; set; }
public int Pending { get; set; }
public int HeadCount { get; set; }
}
List<Sample> samples = new List<Sample>();
protected void FillLeaveplannerDataset()
{
cal2.VisibleDate = cal2.TodaysDate;
DateTime firstDate = new DateTime(cal2.VisibleDate.Year, cal2.VisibleDate.Month, 1).AddDays(-6);
DateTime lastDate = new DateTime(cal2.VisibleDate.Date.AddMonths(1).Year, cal2.VisibleDate.Date.AddMonths(1).Month, 1).AddDays(7);
dsleaveplanner = GetCurrentMonthData(firstDate, lastDate);
}
protected DateTime GetFirstDayOfNextMonth()
{
int monthNumber, yearNumber;
if (cal2.VisibleDate.Month == 12)
{
monthNumber = 1;
yearNumber = cal2.VisibleDate.Year + 1;
}
else
{
monthNumber = cal2.VisibleDate.Month + 1;
yearNumber = cal2.VisibleDate.Year;
}
DateTime lastDate = new DateTime(yearNumber, monthNumber, 1);
return lastDate;
}
protected DataSet GetCurrentMonthData(DateTime firstDate, DateTime lastDate)
{
DataSet dsMonth = new DataSet();
MySqlConnection con = new MySqlConnection("Server=localhost;Database=mydb;Uid=myid;Pwd=abc123;");
string caldate = "Select * From approved Where date >= @firstDate And date <= @lastDate And site=@site And skill=@skill And shift=@shift Group By date";
MySqlCommand cmd = new MySqlCommand(caldate, con);
cmd.Parameters.AddWithValue("@firstDate", firstDate);
cmd.Parameters.AddWithValue("@lastDate", lastDate);
cmd.Parameters.AddWithValue("@site", lblsite.Text);
cmd.Parameters.AddWithValue("@skill", lblskill.Text);
cmd.Parameters.AddWithValue("@shift", lblshift.Text);
MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);
try
{
mysqlDataAdapter.Fill(dsMonth);
}
catch { }
return dsMonth;
}
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
foreach (DataRow dr in dsleaveplanner.Tables[0].Rows)
{
nextDate = (DateTime)dr["date"];
MySqlConnection conn = new MySqlConnection("Server=localhost;Database=mydb;Uid=myid;Pwd=abc123;");
string hc = "SELECT headCount FROM setshrinkage WHERE date = @date";
MySqlCommand cmd1 = new MySqlCommand(hc, conn);
cmd1.Parameters.AddWithValue("@date", nextDate);
conn.Open();
string hcount = cmd1.ExecuteReader().ToString();
Int32 hcount1 = Convert.ToInt32(hcount);
conn.Close();
string cntdate = "SELECT COUNT(date) FROM approved WHERE date = @date";
string cntdate2 = "SELECT COUNT(date) FROM pending WHERE date = @date";
MySqlCommand cmd2 = new MySqlCommand(cntdate, conn);
MySqlCommand cmd3 = new MySqlCommand(cntdate2, conn);
cmd2.Parameters.AddWithValue("@date", nextDate);
cmd3.Parameters.AddWithValue("@date", nextDate);
conn.Open();
string count = cmd2.ExecuteScalar().ToString();
string count2 = cmd3.ExecuteScalar().ToString();
var slot2 = Convert.ToInt32(count);
Int32 slot3 = hcount1 - slot2;
string slot4 = slot3.ToString();
conn.Close();
samples.Add(new Sample { Date = nextDate, SlotAvailable = slot4, Pending = count2, HeadCount = hcount1 });
}
if (samples.Any(x => x.Date == e.Day.Date))
{
e.Cell.BackColor = System.Drawing.Color.Orange;
Environment.NewLine.ToString();
e.Cell.ForeColor = System.Drawing.Color.Red;
e.Cell.Font.Size = 9;
e.Cell.Controls.Add(new LiteralControl("<p></p>Slot available:"));
e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().SlotAvailable.ToString()));
e.Cell.Controls.Add(new LiteralControl("<p></p>Pending:"));
e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().Pending.ToString()));
}
else
{
e.Cell.Font.Size = 9;
e.Cell.Controls.Add(new LiteralControl("<p>Slot available: </p>"));
e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().HeadCount.ToString()));
e.Cell.Controls.Add(new LiteralControl("<p></p>Pending: 0"));
}
}
我已经找到了一种用下面的代码修复错误的方法
protected DataSet GetCurrentMonthData(DateTime firstDate, DateTime lastDate)
{
DataSet dsMonth = new DataSet();
MySqlConnection con = new MySqlConnection("Server=localhost;Database=mydb;Uid=myid;Pwd=abc123;");
string caldate = "Select * From setshrinkage Where date >= @firstDate And date <= @lastDate Group By date";
MySqlCommand cmd = new MySqlCommand(caldate, con);
cmd.Parameters.AddWithValue("@firstDate", firstDate);
cmd.Parameters.AddWithValue("@lastDate", lastDate);
MySqlDataAdapter mysqlDataAdapter = new MySqlDataAdapter(cmd);
try
{
mysqlDataAdapter.Fill(dsMonth);
}
catch { }
return dsMonth;
}
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime nextDate;
if (dsleaveplanner != null)
{
foreach (DataRow dr in dsleaveplanner.Tables[0].Rows)
{
nextDate = (DateTime)dr["date"];
var hcount = (dr["headCount"].ToString());
Int32 hcount1 = Convert.ToInt32(hcount);
MySqlConnection conn = new MySqlConnection("Server=localhost;Database=mydb;Uid=myid;Pwd=abc123;");
string cntdate = "SELECT COUNT(date) FROM approved WHERE date = @date";
string cntdate2 = "SELECT COUNT(date) FROM pending WHERE date = @date";
MySqlCommand cmd2 = new MySqlCommand(cntdate, conn);
MySqlCommand cmd3 = new MySqlCommand(cntdate2, conn);
cmd2.Parameters.AddWithValue("@date", nextDate);
cmd3.Parameters.AddWithValue("@date", nextDate);
conn.Open();
string count = cmd2.ExecuteScalar().ToString();
string count2 = cmd3.ExecuteScalar().ToString();
var slot2 = Convert.ToInt32(count);
Int32 slot3 = hcount1 - slot2;
string slot1 = Convert.ToString(slot3);
string slot4 = slot3.ToString();
conn.Close();
samples.Add(new Sample { Date = nextDate, SlotAvailable = slot1, Pending = count2 });
if (samples.Any(x => x.Date == e.Day.Date))
{
Environment.NewLine.ToString();
e.Cell.Font.Size = 11;
e.Cell.Controls.Add(new LiteralControl("<p></p>Slot available:"));
e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().SlotAvailable.ToString()));
e.Cell.Controls.Add(new LiteralControl("<p></p>Pending:"));
e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().Pending.ToString()));
}
else
{
e.Cell.ForeColor = System.Drawing.Color.Red;
e.Cell.Font.Size = 9;
e.Cell.Controls.Add(new LiteralControl("<p></p>Slot available:"));
e.Cell.Controls.Add(new LiteralControl(slot1));
e.Cell.Controls.Add(new LiteralControl("<p></p>Pending:0"));
}
}
}
但我发现了一个完全不同的问题,如下图所示
标签会重复显示,如上所示。有人能帮我修复它吗?它是通过将条件排除在循环之外来修复的。日历看起来很整洁。谢谢你的支持
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime nextDate;
if (dsleaveplanner != null)
{
foreach (DataRow dr in dsleaveplanner.Tables[0].Rows)
{
nextDate = (DateTime)dr["date"];
var hcount = (dr["headCount"].ToString());
Int32 hcount1 = Convert.ToInt32(hcount);
MySqlConnection conn = new MySqlConnection("Server=localhost;Database=mydb;Uid=myid;Pwd=abc123;");
string cntdate = "SELECT COUNT(date) FROM approved WHERE date = @date";
string cntdate2 = "SELECT COUNT(date) FROM pending WHERE date = @date";
MySqlCommand cmd2 = new MySqlCommand(cntdate, conn);
MySqlCommand cmd3 = new MySqlCommand(cntdate2, conn);
cmd2.Parameters.AddWithValue("@date", nextDate);
cmd3.Parameters.AddWithValue("@date", nextDate);
conn.Open();
string count = cmd2.ExecuteScalar().ToString();
string count2 = cmd3.ExecuteScalar().ToString();
var slot2 = Convert.ToInt32(count);
Int32 slot3 = hcount1 - slot2;
string slot1 = Convert.ToString(slot3);
string slot4 = slot3.ToString();
conn.Close();
samples.Add(new Sample { Date = nextDate, SlotAvailable = slot1, Pending = count2 });
}
if (samples.Any(x => x.Date == e.Day.Date))
{
Environment.NewLine.ToString();
e.Cell.Font.Size = 11;
e.Cell.Controls.Add(new LiteralControl("<p></p>Slot available:"));
e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().SlotAvailable.ToString()));
e.Cell.Controls.Add(new LiteralControl("<p></p>Pending:"));
e.Cell.Controls.Add(new LiteralControl(samples.Where(x => x.Date == e.Day.Date).FirstOrDefault().Pending.ToString()));
}
else
{
e.Cell.ForeColor = System.Drawing.Color.Red;
e.Cell.Font.Size = 9;
e.Cell.Controls.Add(new LiteralControl("<p></p>Slot available:"));
e.Cell.Controls.Add(new LiteralControl(slot1));
e.Cell.Controls.Add(new LiteralControl("<p></p>Pending:0"));
}
}
哦,尝试在此处应用ExecuteScalar而不是ExecuteReader字符串hcount=cmd1.ExecuteReader.ToString;还可以使用断点在此处设置字符串计数=cmd2.ExecuteScalar.ToString;字符串count2=cmd3.ExecuteScalar.ToString;并检查是否收到任何值?好的,我会尝试now@ershoaib我在第行遇到了相同的错误:string hcount=cmd1.ExecuteScalar.ToString;对象引用未设置为对象的实例。请在采样后关闭foreach循环。Addnew Sample{Date=nextDate,SlotAvailable=slot1,Pending=count2};这条线