0

关于dropdownlist的有一个无效 SelectedValue的错误

by 刘武 29. 六月 2010 20:49

使用dropdownlist控件时,如果给SelectedValue赋了一个不存在的值,则会抛出一个异常,提示该控件“有一个无效 SelectedValue,因为它不在项目列表中”。

为了解决这个问题,可以先检查一下dropdownlist的选项,不过那样太麻烦,也不具备通用性,笔者选择了重写该控件,以下是相关的代码:

public class MyDropDownList :DropDownList
{
    public string ExceptionItemText
    {
        get
        {
            if (ViewState["ExceptionItemText"] == null)
                return "-----";
            return ViewState["ExceptionItemText"].ToString();
        }
        set
        {
            ViewState["ExceptionItemText"] = value;
        }
    }

    public string ExceptionItemValue
    {
        get
        {
            if (ViewState["ExceptionItemValue"] == null)
                return "0";
            return ViewState["ExceptionItemValue"].ToString();
        }
        set
        {
            ViewState["ExceptionItemValue"] = value;
        }
    }

    public override string SelectedValue
    {
        get
        {
            return base.SelectedValue;
        }
        set
        {
            try
            {
                base.SelectedValue = value;
            }
            catch (ArgumentOutOfRangeException)
            {
                ListItem itm = new ListItem(ExceptionItemText, ExceptionItemValue);                  
                Items.Insert(0, itm);
                SelectedIndex = 0;
            }
        }
    }

    protected override void OnDataBinding(EventArgs e)
    {
        try
        {
            base.OnDataBinding(e);
        }
        catch (ArgumentOutOfRangeException)
        {
            ListItem itm = new ListItem(ExceptionItemText, ExceptionItemValue);               
            Items.Insert(0, itm);
            SelectedIndex = 0;
        }
    }


}

此处重载了SelectValue属性和OnDataBinding方法,目的是为了兼容两种情况:

一种情况是直接给控件赋值,比如ddl.SelectedValue="0"。

另一种情况是在绑定的时候赋值,比如<asp:DropDownList SelectedValue='<%#Bind("value")%>' > 。

当然你也可以根据自己的需要编写特定的业务逻辑,这里就不再详述。

Tags:

技术生涯

0

修改Ajax Control Toolkit的Calendar控件,使支持月份选取

by 刘武 24. 六月 2010 21:13

微软的Ajax Control Toolkit为我们提供了丰富的控件,可以满足我们开发人员大部分的日常需求。更重要的是他是开源的,为我们学习和修改提供了方便。

最近在使用他的Calendar控件,只要少量的代码就可以添加日历功能,开发起来相当简洁,有兴趣的朋友可以看看官方的demo

但是他有个缺陷,只能选取日期,不能选取月份,为了满足自己的需求,则只能修改源代码了。

首先要去codeplex下载最新的版本40412,当然别忘了再下载一个Ajax Minifier

打开解决方案我们会看到他包含了很多项目

其实不需要太过担心,我们只需要修改其中的两个就行了,一个就是MicrosoftAjax.Extended.VS2008,他包含了所有的客户端脚本,另一个就是AjaxControlToolkit.VS2008,他包含了服务端代码。

下面开始正式的编码工作

一 改写服务端代码,添加EnableMonthSelect属性

打开AjaxControlToolkit.VS2008项目下Calendar文件夹中的CalendarExtender.cs文件,给类CalendarExtender添加属性,这里我就直接添加到了该类的第一行:

[DefaultValue(false)]
[ExtenderControlProperty]
[ClientPropertyName("enableMonthSelect")]
public virtual bool EnableMonthSelect
{
    get { return GetPropertyValue("EnableMonthSelect", false); }
    set { SetPropertyValue("EnableMonthSelect", value); }
}
这是一个bool类型的值,默认为false,对应的客户端属性为enableMonthSelect。

 

二 改写客户端脚本,添加enableMonthSelect

上一步添加了服务端的属性EnableMonthSelect,他对应的客户端属性为enableMonthSelect,因此我们还要给客户端添加该属性。

打开MicrosoftAjax.Extended.VS2008项目下Calendar文件夹中的CalendarBehavior.pre.js文件,我们会看到他其实就是声明了一个javascript类:Sys.Extended.UI.CalendarBehavior,只要将enableMonthSelect属性添加到该类就行了。

我将他添加到了this._format = "d"的上面一行: this._enableMonthSelect = false;注意前面是有下划线的。c#的属性里面都有get,set方法,其实客户端的脚本里面也有,我们只要分别要get_,set_作为函数的前缀就行。这里我将它们添加到了Sys.Extended.UI.CalendarBehavior.prototype = {的下面一行:

get_enableMonthSelect: function() {
    return this._enableMonthSelect;
},
set_enableMonthSelect: function(value) {
    if (this._enableMonthSelect != value) {
        this._enableMonthSelect = value;
        this.raisePropertyChanged("_raisePropertyChanged");
    }
},

三 修改默认行为

在客户端脚本里面找到_cell_onclick函数,可以看到当点击month的时候,他的操作是_switchMode,我们只要修改这里,当enableMonthSelect为true的时候,让他执行和点击日期同样的操作就行了:

case "month":
    if (this._enableMonthSelect) {
        this.set_selectedDate(target.date);
        this._switchMonth(target.date);
        this._blur.post(true);
        this.raiseDateSelectionChanged();
    }
    else {
        if (target.month == visibleDate.getMonth()) {
            this._switchMode("days");
        } else {
            this._visibleDate = target.date;
            this._switchMode("days");
        }
    }
    break;

这样就已经写完了,使用的时候只要将按以下设置就可以

<ajaxToolkit:CalendarExtender ID="c1" runat="server" TargetControlID="d1"
            PopupButtonID="i1" Format="yyyyMM" DefaultView="Months" EnableMonthSelect="true"  />

 

Tags:

技术生涯

0

做一个最简单的Web控件2-AddAttributesToRender

by 刘武 9. 十一月 2009 20:42

回顾上一篇的例子,如果我们直接在页面中添加该控件:<cc1:myhyperlink id="MyHyperLink1" runat="server"></cc1:myhyperlink>,那么浏览该页面的时候你会看到如下的HTML代码:<span id="MyHyperLink1"><a href="http://www.liuwu.net" target="_blank">Welcome To Liuwu.Net</a></span>,比我们预想的多了一个span标签,其实由于我们继承了WebControl类,该类会默认生成<span></span>容器。如果不需要该标签,我们可以重载TagKey属性和AddAttributesToRender方法: 

protected override HtmlTextWriterTag TagKey
{
    get
    {
        return HtmlTextWriterTag.A;
    }
}

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    writer.AddAttribute(HtmlTextWriterAttribute.Href, "http://www.liuwu.net");
    writer.AddAttribute(HtmlTextWriterAttribute.Target, "_blank");
    base.AddAttributesToRender(writer);
}

protected override void RenderContents(HtmlTextWriter output)
{
    output.Write("Welcome To Liuwu.Net");
}

TagKey属性指明了该控件最外层的标签,AddAttributesToRender方法则为该标签添加必要的属性,RenderContents方法在上一篇已经有介绍。重新浏览该页面,Span标签已经没有了。

Tags:

技术生涯

0

做一个最简单的Web控件

by 刘武 4. 十一月 2009 20:28

上一篇了解了asp.net服务器控件的生命周期,本篇来做一个最简单的实例。

首先建立新项目Liuwu.Net.WebControls,用来存放我所有的自定义控件。

然后在项目上右击,并选择添加>新建项,这里我们选择Web自定义控件,并为该控件命名为MyHyperLink,该控件将是一个类似这样的超链接:Welcome To Liuwu.Net

 Visual Studio 将为我们生成以下的模板:

namespace Liuwu.Net.WebControls
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:MyHyperLink runat=server></{0}:MyHyperLink>")]
    public class MyHyperLink : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }
            set
            {
                ViewState["Text"] = value;
            }
        } 

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}

很多东西现在还不懂,不过没关系,现在我们只要明白控件开发的最终目的也就是将HTML代码输出到客户端,而RenderContents方法就是完成这个任务的。看看上面那个超链接,她的HTML代码是不是应该是 <a href="http://www.liuwu.net" target="_blank">Welcome To Liuwu.Net</a>呢,那我们只要在RenderContents方法中输入该代码就可以了。

以下是一种实现方式

[DefaultProperty("Text")]
[ToolboxData("<{0}:MyHyperLink runat=server></{0}:MyHyperLink>")]
public class MyHyperLink : WebControl

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write("<a href=\"http://www.liuwu.net\""+
            "target=\"_blank\">Welcome To Liuwu.Net</a>");
    }
}

这里用了HtmlTextWriter的Write方法直接输出HTML代码(为了显示方便,这里将字符串拆开了)。

编译该项目,并添加网站,在工具栏中就能看到刚才编写的控件了,直接拖到页面上就可以使用,具体过程就不在累赘了。

除了该方法,我们还可以利用服务器控件的RenderControl方法输出控件

HtmlGenericControl a = new HtmlGenericControl("a");
a.Attributes.Add("href", "http://www.liuwu.net");
a.Attributes.Add("target", "_blank");
a.InnerText = "Welcome To Liuwu.Net";
a.RenderControl(output);

注意这里要引入System.Web.UI.HtmlControls命名空间,和第一种方法比起来,该方法显然没那么容易出错,不过也不是十全十美。

下面再介绍第三种方法

output.AddAttribute(HtmlTextWriterAttribute.Href,"http://www.liuwu.net");
output.AddAttribute(HtmlTextWriterAttribute.Target, "_blank");
output.RenderBeginTag(HtmlTextWriterTag.A);
output.Write("Welcome To Liuwu.Net");
output.RenderEndTag();

这里分别使用了HtmlTextWriterAttribute和HtmlTextWriterTag枚举,进一步避免了出错的可能。不过要注意,如果要为标签添加属性,则必须在RenderBeginTag方法之前调用AddAttribute方法。

 

Tags:

技术生涯

3

如何在ASP.NET页面中嵌入WINFORM控件四

by 刘武 22. 十月 2009 20:56

前一篇我们知道了通过调整.NET程序集的区域安全性可以控制winform控件对本地资源的使用权限,本片将介绍另外一种方法,即通过设置URL来设定winform控件的权限。

还是上一篇的例子

打开“管理工具”/ “Microsoft .NET Framework 2.0 配置”

二 展开“运行库安全策略”

 

三 右击All_Code,并选择“新建”,输入代码组名称

 

四 点击下一步,在代码组类型里选择URL,并输入URL的值

五 权限集选择FullTrust,也可以选择创建新权限集

六 单击下一步完成操作

将上一篇写好的空间发布到刚才的URL就可以访问了,而且这样只对特定的URL信任,其他的不会受到影响,也不会担心有安全问题。

笔者测试在IE6下面没有问题,但IE7以上则必须将刚才的URL添加到信任网站才能正常访问(两者均为默认的安全设置)。

部分电脑可能没有该配置程序,则只能通过命令行来设置,具体操作可以查看caspol命令及其帮助,该文件位于\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录下。

前篇:

如何在ASP.NET页面中嵌入WINFORM控件三

如何在ASP.NET页面中嵌入WINFORM控件二

如何在ASP.NET页面中嵌入WINFORM控件一

Tags: ,

技术生涯

Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft