【问题标题】:DropDownList inside an Asp.net Calendar ControlAsp.net 日历控件中的 DropDownList
【发布时间】:2011-10-21 15:26:21
【问题描述】:

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

我可以在我想要的日期内添加DropDownList,但我无法将它绑定到事件。我已经看到它在 Calendar 控件中为 LinkButton 完成,但对于 DropDownList 没有。

【问题讨论】:

  • 服务器端还是客户端事件?
  • 服务器端事件是我想要实现的。
  • 除了我在下面的答案中提供的链接之外,如果它适合您的需求,您可以考虑使用客户端事件来启动一些 AJAX。根据您想要在服务器上实际执行的操作,它可能会带来更好的 UI。
  • @stillsmallvoice - 只是感兴趣,你从哪里得到这个?
  • 谢谢乔恩。所以基本上,我的日历有两个下拉列表和一个选定日期的链接按钮。一旦用户选择了他们的选项,他们就可以使用此答案下方的文章点击链接按钮保存按钮来映射事件。然后我使用了 Page.Request.Params.GetValues("ddlSample")[0];从链接按钮事件的下拉列表中获取值。一点也不理想,但它确实有效。如果我不需要链接按钮并且可以通过选择的索引更改事件来完成它会更好。

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


【解决方案1】:

你也可以这样做。将您的数据放入一个对象变量中,然后将其数据转换为选择标记(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()));
}

希望对你有帮助。

【讨论】:

    【解决方案2】:

    有趣。我不知道这个限制,但找到了一个涉及使用客户端事件处理的解决方法。据作者介绍,涉及到 1)在 DayRender 事件中添加静态控件; 2)让它表现得像一个有事件的动态控件; 3) 传递数据以识别单击了哪个按钮。

    这是链接:http://www.aarongoldenthal.com/post/2009/03/31/Create-Dynamic-Buttons-in-an-ASPNET-Calendar.aspx

    他给出的例子涉及到一个LinkBut​​ton,但是为下拉控件修改它应该不难。

    【讨论】:

    • 谢谢,这是一篇好文章,它确实有效。从文章中,他将 link.NavigateUrl 设置为绑定回事件,你会为 dropdownlist onselectedchange 事件使用什么?我已经尝试添加属性,添加一个 selectedchange 事件,无法让它工作。
    • @user - 在这种情况下,您将添加一个 onchange 事件。因为从下拉框中选择值时会触发 on change。
    • 正如@JonH 所说。您必须使用客户端脚本来启动回发。您将无法以这种方式连接到服务器端 OnSelectedChanged,但这就是为什么它们被称为解决方法。
    【解决方案3】:

    当然可以,我写了有关图像按钮和链接按钮的文章,请在此处使用相同的形式: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 控件时,这些信息是相当可靠的,我过去使用过很多次,并且直截了当由于它的局限性,我不得不停止使用它。

    祝你好运。

    【讨论】:

    • 感谢您的回复!我实际上已经使用了您过去发布的文章,很棒的东西。问题是,帖子处理图像或文字,我还没有看到一篇关于如何在日历控件中准确指定句柄事件的好文章。 MSDN 文档指出:由于在呈现日历控件时会引发 DayRender 事件,因此您不能添加也可以引发事件的控件,例如 LinkBut​​ton。您只能添加静态控件,例如 System.Web.UI.LiteralControl、Label、Image 和 HyperLink。我确定有办法解决这个问题,我就是想不通。
    • @user - 在我的文章中,我添加的控件实际上是可能导致回发的图像按钮,所以我不确定您指的是哪个 MSDN。
    • 嗨 Jon,这是 MSDN 文章 link 。我再次查看了您的文章,但我并没有完全看到我正在尝试做的事情的答案。即使我为下拉列表设置了一个事件处理程序,它在页面周期中被清除了,我不知道如何正确地做到这一点
    猜你喜欢
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多