我做了一个自定义控件,这个控件继承ASP的dropdownlist的所有方法,由于这个控件应客户要求,要客户端如果改变选择后,将变为Disabled,只有双击才能再修改,但这样就无法得到控件的选中的值,因此我在客户端的onchange事件中,将当前选中的项存储到一个隐含字段,并重写了selectedValue属性,将它的值改变为从另外一个隐含字段获取,目前这个功能已经实现,但是我发现这样的话,在postback的时候,无法正常将原先选择的数据恢复,而是默认变为第一项,我想通过IPostBackDataHandle接口实现当数据回传的时候,这个自定义控件也能够恢复为原先选择的项。希望能够得到高手指点,非常感谢!
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;
}
}
}
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()
{
} }
}
我的另外一种思路的代码,这段代码在点提提交按钮后可以实现我想要的功能,但是当页面其它按钮引起数据回发时,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()
{
}
*/
}
}
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控件下来,都可以自动保存你选择的,上面的代码试验下,我也不确认,如果可以回个贴,不行也回个贴,我是残月,黑三老妖介绍认识的那位.呵呵