Asp.net日历控件中的DropDownList

时间:2011-10-21 15:26:21

标签: c# asp.net .net vb.net

是否可以在日历日内为asp.net DropDownList控件添加Calendar,然后将其绑定到SelectedIndexChanged事件?

我可以在我想要的日子里添加DropDownList,但我无法将其绑定到事件中。我已经在LinkButton控件内看到了Calendar,但DropDownList没有。

3 个答案:

答案 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

他给出的示例涉及一个LinkBut​​ton,但是对于下拉控件来修改它应该不难。

答案 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()));
}

我希望它对你有所帮助。