c# - 带有数据源的 Asp 日历重复标签

标签 c# mysql asp.net

我有一个链接到数据源的 asp 日历,它获取日期在数据表中重复的次数,并将其显示在日历上。但是如果同月有 2 个日期在 mysql 表上,那么标签会出现两次,如果有 3 个日期,则标签会出现三次,依此类推,如下图所示。

enter image description here

代码如下所示

protected void Page_Load(Object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            cal2.VisibleDate = DateTime.Today;
            FillLeaveplannerDataset();
        }
    }
    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 date From approved 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"];
                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 = 10 - slot2;
                string slot4 = slot3.ToString();
                conn.Close();
                 if (nextDate == 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(slot4));
                    e.Cell.Controls.Add(new LiteralControl("<p></p>Pending:"));
                    e.Cell.Controls.Add(new LiteralControl(count2));
                }
                else
                {
                    e.Cell.Font.Size = 9;
                    e.Cell.Controls.Add(new LiteralControl("<p>Slot available: 10</p>"));
                    e.Cell.Controls.Add(new LiteralControl("<p></p>Pending: 0"));
                }
            }
        }

    }
    protected void Calendar1_VisibleMonthChanged(object sender,
    MonthChangedEventArgs e)
    {
        DateTime firstDate = e.NewDate.AddDays(-7);
        DateTime lastDate = e.NewDate.AddMonths(1).AddDays(7);
        dsleaveplanner = GetCurrentMonthData(firstDate, lastDate);

    }

我想要的是,如果某个日期没有数据,我希望显示默认值 Slot avalable: 10 和 Pending: 0。我希望每个日期只显示一次可用和待处理的插槽。我在这里错过了什么? 提前致谢

最佳答案

首先用你的名字创建一个示例类

class Sample
{
    public DateTime Date { get; set; }
    public int SlotAvailable { get; set; }
    public int Pending { get; set; }
} 

并创建一个 List<Sample>

List<Sample> samples = new List<Sample>();

然后改变你的foreach喜欢

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 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 = 10 - slot2;
    string slot4 = slot3.ToString();
    conn.Close();

    samples.Add(new Sample { Date = nextDate, SlotAvailable = slot4, Pending = count2 });
}

然后简单地检查是否 e.Day.Date出现在我们的约会中 List<Sample>像这样的约会

 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: 10</p>"));
     e.Cell.Controls.Add(new LiteralControl("<p></p>Pending: 0"));
 }

输出:

enter image description here

关于c# - 带有数据源的 Asp 日历重复标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51835055/

相关文章:

c# - 命名空间 * 已经包含了 * 的定义

c# - 模板 10 : Modal not closing

c# - Request.IsAuthenticated 始终为 false

mysql - SQL查询更新字段

php - 如何知道存储过程是否引发异常?

c# - 如何计算linq中的重复项?

c# - 获取所有可能的参数组合

c# - 将字符串转换为枚举?

java - Hibernate 在尝试使用合并方法更新对象时抛出 DataIntegrityViolationException

asp.net - 如何在 Azure DNS 区域中配置 URL 重定向