是否可以在日历日内为asp.net DropDownList
控件添加Calendar
,然后将其绑定到SelectedIndexChanged
事件?
我可以在我想要的日子里添加DropDownList
,但我无法将其绑定到事件中。我已经在LinkButton
控件内看到了Calendar
,但DropDownList
没有。
答案 0 :(得分:0)
当然有可能我写了关于图像按钮和链接按钮的文章,请按照以下相同的表格:http://weblogs.sqlteam.com/jhermiz/archive/2007/12/10/Cool-Tricks-With-The-ASP.net-Calendar.aspx
编写活动时,您只需指定该活动的Handle
。
在考虑了这个之后,由于asp.net生命周期的运行方式以及它如何处理DayRender
事件,实际上可能无法实现这一点。
即使你做了一些这样的事情:
protected void Calendar1_Render(object sender, DayRenderEventArgs e)
{
if (e.Day.IsWeekend)
{
DropDownList d = new DropDownList();
d.ID = "bah" + e.Day.Date.ToShortDateString();
d.AutoPostBack = true;
d.SelectedIndexChanged += new EventHandler(DropDownList1_SelectedIndexChanged);
d.Items.Add("A");
d.Items.Add("B");
d.Items.Add("C");
e.Cell.Controls.Add(d);
}
}
这不起作用,因为页面加载事件已经在每天渲染时触发,因此即使设置Autopostback=true
也不会起作用。
此外,即使您为动态控件分配了新的EventHandler
,它也不会像这种情况那样工作:
d.SelectedIndexChanged += new EventHandler(yourMethod);
我能想出的唯一可能有效的方法是:
protected void Calendar1_Render(object sender, DayRenderEventArgs e)
{
if (e.Day.IsWeekend)
{
DropDownList d = new DropDownList();
d.ID = "bah" + e.Day.Date.ToShortDateString();
d.Items.Add("A");
d.Items.Add("B");
d.Items.Add("C");
d.Attributes.Add("onchange", "__doPostBack();");
e.Cell.Controls.Add(d);
}
}
问题是,这不会触发您的服务器事件,它只会触发回发帖,但它会让您知道它可以通过某些属性和客户端脚本来触发它。您可以将服务器方法更改为客户端方法吗?如果是这样,那么您可以使用客户端方法的名称替换__doPostBack()
。
不幸的是我不是ASP.net的专家,我在其他方面做了很多,但是当涉及到Calendar控件时,这个信息非常可靠,我过去经常使用它并且已经达到了一定程度由于其局限性,我不得不停止使用它。
祝你好运。答案 1 :(得分:0)
有趣。我不知道这个限制,但找到了一个涉及使用客户端事件处理的解决方法。根据作者的说法,它涉及1)在DayRender事件中添加静态控件; 2)使其行为像具有事件的动态控件; 3)传递数据以识别单击了哪个按钮。
以下是链接:http://www.aarongoldenthal.com/post/2009/03/31/Create-Dynamic-Buttons-in-an-ASPNET-Calendar.aspx
他给出的示例涉及一个LinkButton,但是对于下拉控件来修改它应该不难。
答案 2 :(得分:0)
你也可以这样做。将您的数据转换为一个对象变量,然后将其数据转换为选择标记(html中的下拉列表标记),然后在日历日中添加该控件。
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
stringBuilder matrix = new stringBuilder();
var SemList = (from row in dt.AsEnumerable()
select new
{
SemName = row.Field<string>("SemName"),
SemID = row.Field<string>("SemID")
});
if (SemList != null)
{
Matrix.Append("<select ID='sem_" + dt.Rows[k]["ActualCMID"].ToString() + "' runat='server' width='100px' onchange='" + Server.HtmlEncode("javascript:BindSpecialization('" + dv.ToTable().Rows[k]["ActualCMID"].ToString() + "')").ToString() + "'>");
Matrix.Append("<option value='0'>---Select---</option>");
foreach (var sem in SemList)
{
Matrix.Append("<option value='" + sem.SemID + "'>" + sem.SemName + "</option>");
}
Matrix.Append("</select>");
}
e.Cell.Controls.Add(new LiteralControl(Matrix.ToString()));
}
我希望它对你有所帮助。