C# 从dropdownlist事件访问事件处理程序中的asp.net webcalendar
我有一天的时间去看网络视频。我希望每次从dropdownlist中选择名称时都触发相同的事件,并且DayRenderEvent中唯一需要更改的是数据库查询中的字符串(所选名称) 我该怎么做?每次选择姓名时,我都希望日历显示所选人员的数据库条目 我需要为下拉列表事件重新编写整个代码吗?如果是,我如何访问webcalendar 或者我可以调用DayRenderEvent并将所选名称作为参数传递吗 我的DayRenderEvent方法如下所示:C# 从dropdownlist事件访问事件处理程序中的asp.net webcalendar,c#,asp.net,C#,Asp.net,我有一天的时间去看网络视频。我希望每次从dropdownlist中选择名称时都触发相同的事件,并且DayRenderEvent中唯一需要更改的是数据库查询中的字符串(所选名称) 我该怎么做?每次选择姓名时,我都希望日历显示所选人员的数据库条目 我需要为下拉列表事件重新编写整个代码吗?如果是,我如何访问webcalendar 或者我可以调用DayRenderEvent并将所选名称作为参数传递吗 我的DayRenderEvent方法如下所示: protected void Calendar1_Day
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
数据集方法
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);
}
}
}
这看起来像是一个典型的重构案例(并且遵循了这个原则)。我建议的最简单的事情是识别将在两个事件之间共享的公共代码,并使用VisualStudio中的重构-提取方法功能提取这些代码 你正在打破的另一个关键原则是“S”。看看你的方法所承担的责任。它执行数据库查询,迭代结果,然后操纵日历控件。这确实需要分解成不同的方法。这将使测试和bug修复变得更加容易(并且可以防止代码重复)。虽然有文档记录了应用于类的方法,但我也尽力将其应用于我的方法
我知道我可能没有提供您希望的答案(即完整的代码示例),但如果您将其分解并保持干燥,您将得到更干净的代码。是的,我知道,代码远不是很好(我只是太不懂编程)。我肯定会在某个时候优化代码,但现在我只是在寻找一个可行的解决方案。一旦我有了这些,我将考虑改进代码。Thanx虽然有链接!但同样:假设我将迭代放入另一个方法中:那么我必须将DayOfWeek comptag作为参数传递,将DataSet作为参数传递,将DayRenderEvent作为参数传递。然后我只能对DayRenderEvent使用该迭代方法。。。然后我遇到了同样的问题,我无法从SelectedIndexChanged事件方法中访问它…我认为您可能需要更多地考虑一下您的设计,DayRender事件在日历中每天调用一次,因此您最终会调用那么多数据库。这不好。您需要尽量减少数据库调用,最好只调用一次。我建议您重构此方法中的DB调用,将结果存储在某个位置,然后在此方法中使用这些结果。一个选项(可能有效,也可能无效)是将下拉列表的autopostback属性设置为true,当页面重新加载时,日历将执行您的逻辑重新呈现。我已经将autopostback设置为true,当我按下按钮时会有连接。我只是在努力学习如何渲染日历。我现在的问题是,我不知道如何从DayRenderEvent之外访问日历的单元格。比如说,我想在SelectedIndexChanged方法启动后,动态地向日历添加一个dropdownlist。这一定是可能的,不是吗?我不认为你可以访问DayRender事件之外的单元格,但这不重要。当下拉列表的SelectedIndexChanged触发时,将调用DayRender事件(作为回发的一部分)。e、 如果选择了下拉列表中的第二项,则添加if(DropDownList1.SelectedIndex==1){e.Cell.Controls.Add(new DropDownList());}将每天添加一个新的下拉列表控件。我不确定这是否有用?
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);
}
}
}
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();
}
}