none
“System.Web.UI.UserControl”并不包含“selectedDateTime”的定义_ RRS feed

  • 问题

  • 我在页面插入用户控件<Club:DateandTimePicker ID="Date" runat="server" selectedDateTime='<%#Bind("itemdate") %>' />
    用户控件DateandTimePicker.ascx代码:
    <%@ Control Language="c#" ClassName="DateandTimePicker" %>
    <%@ Register TagPrefix="Club" Namespace="ClubSite" %>

    <script runat="server">
        public System.DateTime selectedDateTime
        {
            get
            {
                return dp1.SelectedDate.Add(new TimeSpan(1));
            }
            set
            {
                dp1.SelectedDate = value;
                //tp1.SelectedTime = value;
            }
        }
       
    </script>
    <div class="controlblock">

        <table>
            <tr>
                <td>
                    Date:
                </td>
                <td>
                    <club:datepicker id="dp1" runat="server"/>
                </td>
               
            </tr>
        </table>

    </div>

    而DatePicker.cs代码:
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Text;
    using System.Drawing;


    namespace ClubSite
    {
        public static class commonScript
        {

            public static void WritePopupRoutines(System.Web.UI.Page Page)
            {
                StringBuilder sb = new StringBuilder();
                sb = new StringBuilder();
                sb.AppendLine("var __popup_panel;");

                sb.AppendLine("function __popup_clear() {");
                sb.AppendLine(" if (__popup_panel != null ) ");
                sb.AppendLine(" {");
                sb.AppendLine(" document.getElementById(__popup_panel).style.display='none';");
                sb.AppendLine(" __popup_panel=null;");
                sb.AppendLine(" }");
                sb.AppendLine("}");
                sb.AppendLine("function __popup_losefocus(panel)");
                sb.AppendLine("{");
                sb.AppendLine(" if (!panel.contains(document.activeElement))");
                sb.AppendLine(" {");
                sb.AppendLine(" panel.style.display='none';");
                sb.AppendLine(" }");
                sb.AppendLine("}");

                Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), "PopupRoutines", sb.ToString(), true);
            }
        }

        public class DatePicker : WebControl, INamingContainer
        {
            private Calendar _innerCal;
            private TextBox _innerTbx;
            private string errorText = null;
            private bool _panelvisible = false;
           
            public DatePicker() : base(HtmlTextWriterTag.Div)
            {
                CreateChildControls();
            }

            public System.DateTime SelectedDate
            {
                get
                {
                    EnsureChildControls();
                    System.DateTime d=System.DateTime.Now;
                    try
                    {
                        d = System.DateTime.Parse(_innerTbx.Text);
                        errorText = null;
                        _innerCal.SelectedDate = d;
                    }
                    catch
                    {
                        errorText = "";
                    }
                    return d;
                }
                set
                {
                    EnsureChildControls();
                    _innerCal.SelectedDate = value;
                    _innerTbx.Text = value.ToShortDateString();
                }
            }

            protected override void CreateChildControls()
            {
                //初始化时
                base.CreateChildControls();
                _innerTbx = new TextBox();
                _innerTbx.Text = System.DateTime.Now.ToShortDateString();
                this.Controls.Add(_innerTbx);

                _innerCal = new Calendar();
                _innerCal.FirstDayOfWeek = System.Web.UI.WebControls.FirstDayOfWeek.Sunday;
                _innerCal.BackColor = Color.White;
                _innerCal.CellPadding = 4;
                _innerCal.Font.Name = "Verdana";
                _innerCal.SelectedDayStyle.BackColor = Color.SlateBlue;
                _innerCal.SelectedDayStyle.Font.Bold = true;
                _innerCal.SelectedDayStyle.ForeColor = Color.White;
                _innerCal.SelectorStyle.BackColor = Color.LightGray;
                _innerCal.ForeColor = Color.Navy;
                _innerCal.WeekendDayStyle.BackColor = Color.Khaki;
                _innerCal.OtherMonthDayStyle.ForeColor = Color.Gray;
                _innerCal.NextPrevStyle.VerticalAlign = VerticalAlign.Bottom;
                _innerCal.DayHeaderStyle.BackColor = Color.BurlyWood;
                _innerCal.DayHeaderStyle.Font.Bold = true;
                _innerCal.TitleStyle.BackColor = Color.LightSlateGray;
                _innerCal.TitleStyle.Font.Bold = true;

                _innerCal.SelectionChanged += new System.EventHandler(_innerCal_SelectionChanged);
                _innerCal.VisibleMonthChanged += new MonthChangedEventHandler(_innerCal_MonthChanged);
                Controls.Add(_innerCal);
            }

            protected override System.Web.UI.HtmlTextWriterTag TagKey
            {
                get
                {
                    return HtmlTextWriterTag.Div;
                }
            }

            protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer)
            {
                if (this.Width.IsEmpty)
                {
                    this.Width = new Unit(150);
                }
                base.AddAttributesToRender(writer);
            }

            protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
            {
                //设置textbox的属性
                _innerTbx.Attributes.Add("Align", "AbsMiddle");
                _innerTbx.Width = new Unit(100);
                _innerTbx.ReadOnly = true;
                _innerTbx.RenderControl(writer);

                string innerid = this.UniqueID + "_inner";
                writer.AddAttribute("Align", "AbsMiddle");
                writer.AddAttribute("src", "../image/dropdownbtn.gif");
                writer.AddAttribute("onClick", "__datepicker_showpopup('" + innerid + "')");
                writer.RenderBeginTag(HtmlTextWriterTag.Img);
                writer.RenderEndTag();
               
                if (errorText != null)
                {
                    writer.AddStyleAttribute("color", "red");
                    writer.AddStyleAttribute("display", "block");
                    writer.RenderBeginTag(HtmlTextWriterTag.Span);
                    writer.Write(errorText);
                    writer.RenderEndTag();
                }

                writer.AddStyleAttribute("position", "relative");
                writer.RenderBeginTag(HtmlTextWriterTag.Div);

                writer.AddStyleAttribute("position", "absolute");
                writer.AddStyleAttribute("left", "0px");
                writer.AddStyleAttribute("top", "0px");
                writer.AddStyleAttribute("z-index", "100");

                string panelvisible = _panelvisible ? "block" : panelvisible = "none";

                writer.AddStyleAttribute("display", panelvisible);
                writer.AddStyleAttribute("background-color", "white");
                writer.AddAttribute("id", innerid);
                writer.AddAttribute("onfocusout", "__popup_losefocus(this)");
                writer.RenderBeginTag(HtmlTextWriterTag.Div);

                _innerCal.RenderControl(writer);

                writer.RenderEndTag();
                writer.RenderEndTag();
            }

            protected override void OnPreRender(System.EventArgs e)
            {
                base.OnPreRender(e);
                commonScript.WritePopupRoutines(Page);
                StringBuilder sb = new StringBuilder();
                if (_panelvisible)
                {
                    sb.AppendLine("__popup_panel = '" + this.UniqueID + "_inner';");
                }
                sb.AppendLine("function __datepicker_showpopup(name)");
                sb.AppendLine("{");
                sb.AppendLine(" if (__popup_panel != null)");
                sb.AppendLine(" {");
                sb.AppendLine(" document.getElementById(__popup_panel).style.display='none';");
                sb.AppendLine(" }");
                sb.AppendLine(" __popup_panel=name;");
                sb.AppendLine(" var panel=document.getElementById(__popup_panel);");
                sb.AppendLine(" panel.style.display='block';");
                sb.AppendLine(" var links=panel.getElementsByTagName('A');");
                sb.AppendLine(" links[0].focus();");
                sb.AppendLine(" window.event.cancelBubble=true;");
                sb.AppendLine("}");
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "popup", sb.ToString(), true);
                Page.MaintainScrollPositionOnPostBack = true;
            }

            private void _innerCal_SelectionChanged(object sender, System.EventArgs e)
            {
                EnsureChildControls();
                _innerTbx.Text = _innerCal.SelectedDate.ToShortDateString();
            }

            private void _innerCal_MonthChanged(object sender, MonthChangedEventArgs e)
            {
                _panelvisible = true;
            }
        }
    }


    请问如何解决这个问题。

    2010年2月11日 6:51

答案

  • 你好,

    不知道你的项目是什么结构。

    我直接在我本地新建一个websites,然后添加一个自定义控件类在App_Code下面,再添加一个usercongtrol,然后编译发布IIS7.0。

    运行也很正常。
    如果你是通过引用dll把这个控件引入的,记住一定要在其属性中设置copytolocal为true。

    另外如上面的版主所说,一定不能这样用:
    selectedDateTime='<%#Bind("itemdate") %>'

    你先不设置这个属性试试。上面这种写法是数据绑定控件的写法。

    Microsoft Online Community Support
    2010年2月18日 2:22

全部回复

  • 用户控件不能bind写入 只能输出
    2010年2月11日 10:57
  • 请勿一帖多发,版主会删除的。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年2月11日 23:19
    版主
  • 这个 selectedDateTime='<%#Bind("itemdate") %>' 是输出。
    即时把这个属性设为为空,也报一样的错。
    2010年2月12日 5:35
  • 我觉得你那个属性有问题啊 单个datetime变量属性 没有问题 (我测试过) 可能你那个控件有问题的


    还有你注册这个控件了吗 比如 aspx中 <%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %> 这样标记
    2010年2月12日 14:21
  • 有,注册了

    2010年2月16日 0:29
  • 你好,

    你的代码我在本地测试过了,没有任何问题。先将我的结果显示如下。


    测试代码可以去下面地址下载。
    http://files.cnblogs.com/wuwei_chen/CustomizeControlDemo.rar
    Microsoft Online Community Support
    2010年2月17日 2:07
  • 是啊,我这边也能运行,可是我要发布网站的时候,就提示这个错误,然后发布不成功。好几天了,都不知道怎么解决。
    2010年2月18日 0:31
  • 你好,

    不知道你的项目是什么结构。

    我直接在我本地新建一个websites,然后添加一个自定义控件类在App_Code下面,再添加一个usercongtrol,然后编译发布IIS7.0。

    运行也很正常。
    如果你是通过引用dll把这个控件引入的,记住一定要在其属性中设置copytolocal为true。

    另外如上面的版主所说,一定不能这样用:
    selectedDateTime='<%#Bind("itemdate") %>'

    你先不设置这个属性试试。上面这种写法是数据绑定控件的写法。

    Microsoft Online Community Support
    2010年2月18日 2:22