我有一个用于网络日历的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();
}
}
答案 0 :(得分:1)
这看起来像是重构(并遵守DRY原则)的经典案例。我建议最简单的方法是确定将在两个事件之间共享的公共代码,并使用Visual Studio中的重构 - 提取方法功能提取它。
你要打破的另一个关键原则是SOLID中的'S'。查看您的方法所负责的责任。它正在执行数据库查询,迭代结果,然后操纵日历控件。这确实需要分解为单独的方法。这将使测试和错误修复变得更加容易(并且您将防止重复代码)。虽然记录Single Responsibility Principle适用于类,但我也尽力将其应用于我的方法。
我知道我可能没有提供你希望得到的答案(即一个完整的代码示例),但是如果你把它分解并坚持干,你最终会得到更清晰的代码。