从dropdownlist事件中访问事件处理程序中的asp.net webcalendar

时间:2013-11-28 13:34:33

标签: c# asp.net

我有一个用于网络日历的DayRenderEventHandler。我想要在每次选择下拉列表中的名称时触发相同的事件,并且DayRenderEvent中唯一需要更改的是数据库查询中的字符串(所选名称)。

我该怎么做?每次选择名称时,我希望日历显示所选人员的数据库条目。

我是否需要再次为下拉列表事件编写整个代码?如果是这样,我如何访问网络日历?

或者我可以以某种方式调用DayRenderEvent并将所选名称作为参数传递?

我的DayRenderEvent方法如下所示:

protected void Calendar1_DayRenderEventHandler(object sender, DayRenderEventArgs e)
        {
            try
            {

               //Database stuff

                if (maxCode != null && maxCode2 != null)
                {
                    da = new SqlDataAdapter(cmd);

                    ds = new DataSet();
                    da.FillSchema(ds, SchemaType.Source);
                    da.Fill(ds);

                    list1 = new DropDownList();
                    list1.DataSource = ds;
                    list1.DataTextField = "A_TYPE";
                    list1.DataValueField = "A_TYPE";
                    list1.DataBind();

                    da2 = new SqlDataAdapter(cmd2);
                    ds2 = new DataSet();
                    da2.FillSchema(ds2, SchemaType.Source);
                    da2.Fill(ds2);

                    list2 = new DropDownList();
                    list2.DataSource = ds2;
                    list2.DataTextField = "A_Type";
                    list2.DataValueField = "A_Type";
                    list2.DataBind();

                    DayOfWeek comptag = e.Day.Date.DayOfWeek;
                    for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
                    {
                        string thisday = e.Day.Date.ToString();
                        string dayfromdb = ds2.Tables[0].Rows[i]["Date"].ToString();
                        list.Add(dayfromdb);

                        if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && dayfromdb == thisday)
                        {
                            e.Cell.Controls.Add(list2);
                        }
                        else if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && list.Contains(thisday) == false)
                        {
                            e.Cell.Controls.Add(list1);
                        }
                    } // for
                }
                else
                {
                    e.Cell.Text = "MaxCode or MaxCode2 == null";
                }
            }
            catch (Exception exptn)
            {
                string exp = exptn.StackTrace;
            }
            finally
            {
                con.Close();
            }
        } // DayRenderEventHandler

现在,如果我在下拉列表的OnSelectedIndexChanged-Event中使用相同的代码,它就无法识别e.Cell和e.Day.Date等等(我想是因为据我所知,事件来源在DayRenderEvent中是Calendar1,在OnSelectedIndexChanged中是下拉列表。

这是最好的方法吗?

感谢您的帮助!

+++++ EDIT +++++++++++++++++++

数据库连接的方法

private SqlConnection DBConnect()
{
    con = new SqlConnection();
    con.Open();
    return con;
}

数据集方法

 private DataSet createDataSet(SqlCommand cmd)
        {
            da = new SqlDataAdapter(cmd);
            ds = new DataSet();
            da.FillSchema(ds, SchemaType.Source);
            da.Fill(ds);
            return ds;
        }

迭代日历天的方法

private void CalendarIterate(DataSet ds2, DayOfWeek comptag, DayRenderEventArgs e)
        {
            for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
            {
                string thisday = e.Day.Date.ToString();
                string dayfromdb = ds2.Tables[0].Rows[i]["Date"].ToString();
                liste.Add(dayfromdb);

                if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && dayfromdb == thisday)
                {
                    e.Cell.Controls.Add(list2);
                }
                else if (comptag != DayOfWeek.Saturday && comptag != DayOfWeek.Sunday && e.Day.IsOtherMonth == false && liste.Contains(thisday) == false)
                {
                    e.Cell.Controls.Add(list1);
                }
            }
        }

现在在DayRender-Method中调用这些方法(它仍然为每天创建一个数据库连接,我仍然需要查看它。)

protected void Calendar1_DayRenderEventHandler(object sender, DayRenderEventArgs e)
        {
            try
            {
                con = DBConnect();
                cmd = new SqlCommand("", con);
                cmd2 = new SqlCommand("", con);
                maxCode = cmd.ExecuteScalar();
                maxCode2 = cmd2.ExecuteScalar();

                if (maxCode != null && maxCode2 != null)
                {
                    list1 = new DropDownList();
                    list1.DataSource = createDataSet(cmd);
                    list1.DataTextField = "A_TYP";
                    list1.DataValueField = "A_TYP";
                    list1.DataBind();

                    list2= new DropDownList();
                    list2.DataSource = createDataSet(cmd2);
                    list2.DataTextField = "A_Typ";
                    list2.DataValueField = "A_Typ";
                    list2.DataBind();

                    DayOfWeek comptag = e.Day.Date.DayOfWeek;
                    CalendarIterate(createDataSet(cmd2), comptag, e);
                }
                else
                {
                    e.Cell.Text = "MaxCode or MaxCode2 == null";
                }
            }
            catch (Exception exptn)
            {
                string exp = exptn.StackTrace;
            }
            finally
            {
                con.Close();
            }
        }

1 个答案:

答案 0 :(得分:1)

这看起来像是重构(并遵守DRY原则)的经典案例。我建议最简单的方法是确定将在两个事件之间共享的公共代码,并使用Visual Studio中的重构 - 提取方法功能提取它。

你要打破的另一个关键原则是SOLID中的'S'。查看您的方法所负责的责任。它正在执行数据库查询,迭代结果,然后操纵日历控件。这确实需要分解为单独的方法。这将使测试和错误修复变得更加容易(并且您将防止重复代码)。虽然记录Single Responsibility Principle适用于类,但我也尽力将其应用于我的方法。

我知道我可能没有提供你希望得到的答案(即一个完整的代码示例),但是如果你把它分解并坚持干,你最终会得到更清晰的代码。