我做了一个自定义控件,这个控件继承ASP的dropdownlist的所有方法,由于这个控件应客户要求,要客户端如果改变选择后,将变为Disabled,只有双击才能再修改,但这样就无法得到控件的选中的值,因此我在客户端的onchange事件中,将当前选中的项存储到一个隐含字段,并重写了selectedValue属性,将它的值改变为从另外一个隐含字段获取,目前这个功能已经实现,但是我发现这样的话,在postback的时候,无法正常将原先选择的数据恢复,而是默认变为第一项,我想通过IPostBackDataHandle接口实现当数据回传的时候,这个自定义控件也能够恢复为原先选择的项。希望能够得到高手指点,非常感谢!

解决方案 »

  1.   

    控件源代码:using System;
    using System.Text;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;[assembly:TagPrefix("Controls","dropdown")]namespace OASystem.Controls
    {
    /// <summary>
    /// dropdownlist 的摘要说明。
    /// </summary>
    [DefaultProperty("Text"), 
    ToolboxData("<{0}:dropdownlist runat=server></{0}:dropdownlist>")]
    public class dropdownlist:System.Web.UI.WebControls.DropDownList,IPostBackDataHandle 
    {
    private string myfunction;

    [Bindable(true), 
    Category("Appearance"), 
    DefaultValue("")] 
    public override string SelectedValue
    {
    get
    {
    return System.Web.HttpContext.Current.Request.Form.Get("Hid_OA_"+base.ID);
    }

    } [Bindable(true), 
    Category("Appearance"), 
    DefaultValue(""), 
    Description("在执行OnChange事件时,同时要执行的函数")]
    public string FunctionName
    {
    get
    {
    return myfunction;
    }

    set
    {
    myfunction = value;
    }

    } string replaceStr1ToStr2(string str1,string str2,string str3)
    {
    //str1 是包含有要替换的字符串的 原字符串
    //str2 是要替换的字符串
    //str3 是要将 str2 替换成的 str3
    StringBuilder d=new StringBuilder(str1);
    d=d.Replace(str2,str3);
    return d.ToString();
    }
    /// <summary> 
    /// 将此控件呈现给指定的输出参数。
    /// </summary>
    /// <param name="output"> 要写出到的 HTML 编写器 </param>
     protected override void Render(HtmlTextWriter output)
    {
    output.Write("<span onDblClick=CanChange(" + base.ID + ");>");
     output.Write("<input id=Hid_OA_"+base.ID+" name=Hid_OA_"+base.ID+" type=hidden>");
    base.RenderBeginTag(output);
    base.RenderContents(output);
    base.RenderEndTag(output);
    output.Write("</span>");
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {

    string str; str = replaceStr1ToStr2(myfunction, "(", "\\(");
    str = replaceStr1ToStr2(str, ")", "\\)");
    str = replaceStr1ToStr2(str, "'", "\\'");
    str = replaceStr1ToStr2(str, "\"", "\\\"");
    base.AddAttributesToRender(writer);
    writer.AddAttribute("onChange","javascript:NoChange(this,'"+str+"');");
    writer.AddAttribute("title","要编辑此选项,请双击");
    }

    public bool LoadPostData(string postDataKey,NameValueCollection postCollection)
    {
    string postedValue = postCollection[postDataKey];
    }
    }
    }
    ---------------------------------------------------------------------------------------
    客户端相关脚本:function GetDropdownListValue(objForm)
    {for (var i=0;i<objForm.elements.length;i++)
      {
       
              var ee=objForm.elements[i];
        if (ee.name.indexOf('Hid_OA_')!=-1)
    {
     obj = eval(objForm.name+"."+ee.name.substring(7));
     ee.value=obj.options[obj.selectedIndex].text;
     
    }
       }
    }
      

  2.   

    对不起,刚才服务器端控件书写有误,不能正常编译,我修改了一下:using System;
    using System.Text;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Collections.Specialized;
    using System.ComponentModel;[assembly:TagPrefix("Controls","dropdown")]namespace OASystem.Controls
    {
    /// <summary>
    /// dropdownlist 的摘要说明。
    /// </summary>
    [DefaultProperty("Text"), 
    ToolboxData("<{0}:dropdownlist runat=server></{0}:dropdownlist>")]
    public class dropdownlist:System.Web.UI.WebControls.DropDownList,IPostBackDataHandler 
    {
    private string myfunction;

    [Bindable(true), 
    Category("Appearance"), 
    DefaultValue("")] 
    public override string SelectedValue
    {
    get
    {
    return System.Web.HttpContext.Current.Request.Form.Get("Hid_OA_"+base.ID);
    }

    } [Bindable(true), 
    Category("Appearance"), 
    DefaultValue(""), 
    Description("在执行OnChange事件时,同时要执行的函数")]
    public string FunctionName
    {
    get
    {
    return myfunction;
    }

    set
    {
    myfunction = value;
    }

    } string replaceStr1ToStr2(string str1,string str2,string str3)
    {
    //str1 是包含有要替换的字符串的 原字符串
    //str2 是要替换的字符串
    //str3 是要将 str2 替换成的 str3
    StringBuilder d=new StringBuilder(str1);
    d=d.Replace(str2,str3);
    return d.ToString();
    }
    /// <summary> 
    /// 将此控件呈现给指定的输出参数。
    /// </summary>
    /// <param name="output"> 要写出到的 HTML 编写器 </param>
     protected override void Render(HtmlTextWriter output)
    {
    output.Write("<span onDblClick=CanChange(" + base.ID + ");>");
     output.Write("<input id=Hid_OA_"+base.ID+" name=Hid_OA_"+base.ID+" type=hidden>");
    base.RenderBeginTag(output);
    base.RenderContents(output);
    base.RenderEndTag(output);
    output.Write("</span>");
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {

    string str; str = replaceStr1ToStr2(myfunction, "(", "\\(");
    str = replaceStr1ToStr2(str, ")", "\\)");
    str = replaceStr1ToStr2(str, "'", "\\'");
    str = replaceStr1ToStr2(str, "\"", "\\\"");
    base.AddAttributesToRender(writer);
    writer.AddAttribute("onChange","javascript:NoChange(this,'"+str+"');");
    writer.AddAttribute("title","要编辑此选项,请双击");
    }

    public bool LoadPostData(string postDataKey,
    NameValueCollection postCollection)
    {
    string postedValue = postCollection[postDataKey];
    base.Items.FindByValue(System.Web.HttpContext.Current.Request.Form.Get("Hid_OA_"+base.ID));
    return true;
    } public virtual void RaisePostDataChangedEvent()
    {
        
    } }
    }
      

  3.   


    我的另外一种思路的代码,这段代码在点提提交按钮后可以实现我想要的功能,但是当页面其它按钮引起数据回发时,dropdownlist的状态不能恢复。using System;
    using System.Text;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Collections.Specialized;
    using System.ComponentModel;[assembly:TagPrefix("Controls","dropdown")]namespace OASystem.Controls
    {
    /// <summary>
    /// dropdownlist 的摘要说明。
    /// </summary>
    [DefaultProperty("Text"), 
    ToolboxData("<{0}:dropdownlist runat=server></{0}:dropdownlist>")]
    public class dropdownlist:System.Web.UI.WebControls.DropDownList //,IPostBackDataHandler 
    {
    private string myfunction;
    private string temp;
    [Bindable(true), 
    Category("Appearance"), 
    DefaultValue("")] 
    public override string SelectedValue
    {
    get
    {
    temp = System.Web.HttpContext.Current.Request.Form.Get("Hid_OA_"+base.ID);
    return temp;
    }

    } [Bindable(true), 
    Category("Appearance"), 
    DefaultValue(""), 
    Description("在执行OnChange事件时,同时要执行的函数")]
    public string FunctionName
    {
    get
    {
    return myfunction;
    }

    set
    {
    myfunction = value;
    }

    } string replaceStr1ToStr2(string str1,string str2,string str3)
    {
    //str1 是包含有要替换的字符串的 原字符串
    //str2 是要替换的字符串
    //str3 是要将 str2 替换成的 str3
    StringBuilder d=new StringBuilder(str1);
    d=d.Replace(str2,str3);
    return d.ToString();
    }
    /// <summary> 
    /// 将此控件呈现给指定的输出参数。
    /// </summary>
    /// <param name="output"> 要写出到的 HTML 编写器 </param>
     protected override void Render(HtmlTextWriter output)
    {
    int i;

     output.Write("<span onDblClick=CanChange(" + base.ID + ");>");
     output.Write("<input id=Hid_OA_"+base.ID+" name=Hid_OA_"+base.ID+" type=hidden>");
    base.RenderBeginTag(output);
     output.Write("testok");
     output.Write(temp);
     if(temp=="") base.RenderContents(output);
     else
     {
     for(i=0;i<base.Items.Count;i++)
     {
     if(temp==base.Items[i].Value.Trim())
     {
     output.Write("<option value='" + base.Items[i].Value + "' selected>"+base.Items[i].Text+"</option>");
     }
     else
     {
             output.Write("<option value='" + base.Items[i].Value + "'>"+base.Items[i].Text+"</option>");
     }
     }
     }
    base.RenderEndTag(output);
    output.Write("</span>");
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {

    string str; str = replaceStr1ToStr2(myfunction, "(", "\\(");
    str = replaceStr1ToStr2(str, ")", "\\)");
    str = replaceStr1ToStr2(str, "'", "\\'");
    str = replaceStr1ToStr2(str, "\"", "\\\"");
    base.AddAttributesToRender(writer);
    writer.AddAttribute("onChange","javascript:NoChange(this,'"+str+"');");
    writer.AddAttribute("title","要编辑此选项,请双击");
    }

    /* public bool LoadPostData(string postDataKey,
    NameValueCollection postCollection)
    {
    string postedValue = postCollection[postDataKey];
    base.Items.FindByValue(System.Web.HttpContext.Current.Request.Form.Get("Hid_OA_"+base.ID));
    return true;
    } public virtual void RaisePostDataChangedEvent()
    {
        
    }
    */
    }
    }
      

  4.   

    using System;
    using System.Text;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Collections.Specialized;
    using System.ComponentModel;[assembly:TagPrefix("Controls","dropdown")]namespace UserControlTest
    {
    /// <summary>
    /// dropdownlist 的摘要说明。
    /// </summary>
    [DefaultProperty("Text"), 
    ToolboxData("<{0}:dropdownlist runat=server></{0}:dropdownlist>")]
    public class drpdownlist:System.Web.UI.WebControls.DropDownList 
    {
    private string myfunction;

    [Bindable(true), 
    Category("Appearance"), 
    DefaultValue(""), 
    Description("在执行OnChange事件时,同时要执行的函数")]
    public string FunctionName
    {
    get
    {
    return myfunction;
    }

    set
    {
    myfunction = value;
    }

    } string replaceStr1ToStr2(string str1,string str2,string str3)
    {
    //str1 是包含有要替换的字符串的 原字符串
    //str2 是要替换的字符串
    //str3 是要将 str2 替换成的 str3
    StringBuilder d=new StringBuilder(str1);
    d=d.Replace(str2,str3);
    return d.ToString();
    }
    /// <summary> 
    /// 将此控件呈现给指定的输出参数。
    /// </summary>
    /// <param name="output"> 要写出到的 HTML 编写器 </param>
    protected override void Render(HtmlTextWriter output)
    {
    output.Write("<span onDblClick=CanChange(" + base.ID + ");>");
    output.Write("<input id=Hid_OA_"+base.ID+" name=Hid_OA_"+base.ID+" type=hidden>");
    base.RenderBeginTag(output);
    base.RenderContents(output);
    base.RenderEndTag(output);
    output.Write("</span>");
    }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
    string str; str = replaceStr1ToStr2(myfunction, "(", "\\(");
    str = replaceStr1ToStr2(str, ")", "\\)");
    str = replaceStr1ToStr2(str, "'", "\\'");
    str = replaceStr1ToStr2(str, "\"", "\\\"");
    base.AddAttributesToRender(writer);
    writer.AddAttribute("onChange","javascript:NoChange(this,'"+str+"');");
    //writer.AddAttribute("onChange","javascript:alert('ddd');");
    writer.AddAttribute("title","要编辑此选项,请双击");
    }

    }
    }
    你用上面的试验一下,我这边试了下没问题,我觉得不用实做IPostBack接口也能实现,因为你随便拖个dropdownlist控件下来,都可以自动保存你选择的,上面的代码试验下,我也不确认,如果可以回个贴,不行也回个贴,我是残月,黑三老妖介绍认识的那位.呵呵