问个苯苯的问题哈!关于自定义控件的!谢谢!Please Come In!

hackate 2005-08-09 10:15:32
最近看到QQ论坛上有个可以变色的DropDownList的下拉框,他里面的项的字体是可以变色的!代码如下:
<select id="ddl">
<option style="COLOR:#ff3f6f">你好</option>
</select>
但是默认的DropDownList是没这个功能的!所以只有自己做个自定义控件了!

昨天用Reflector看了看!发现DropDownList是继承至ListControl的,可是ListControl他的items集合是来自ListItemCollection类,可是继承不了ListItemCollection
这样无法重写里面的add方法,等等,这样我想在加的时候可以这样
ddl.items.add("nihao","value","color")
这种形式的!

请问我应该怎么做嫩,能给我个思路。或者给个相应的例子,有代码也可以,非常非常感谢,谢谢!
...全文
690 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
CnEve 2005-10-12
  • 打赏
  • 举报
回复
学到不少,留个记号。
hackate 2005-09-09
  • 打赏
  • 举报
回复
后来发现控件在PostBack后不能保持状态!
请教Haneryfan1的答案如下:
public class MyDrop :DropDownList
{
protected override void RenderContents(HtmlTextWriter writer)
{
ListItemCollection listItemCollection = base.Items;
int i = base.Items.Count;
bool flag = false;
if (i > 0)
{
for (int j = 0; j < i; j++)
{
ListItem listItem = listItemCollection[j];
writer.WriteBeginTag("option");
if (listItem.Selected)
{
if (flag)
{
throw new HttpException("Cant_Multiselect_In_DropDownList");
}
flag = true;
writer.WriteAttribute("selected", "selected", false);


}
writer.WriteAttribute("value", listItem.Value, true);
System.Web.UI.AttributeCollection attributeCollection = listItem.Attributes;
IEnumerator iEnumerator = attributeCollection.Keys.GetEnumerator();
while (iEnumerator.MoveNext())
{
string str2 = (String)iEnumerator.Current;
writer.Write(" "+str2+"=\""+attributeCollection[str2]+"\"");
}
writer.Write('>');
HttpUtility.HtmlEncode(listItem.Text, writer);
writer.WriteEndTag("option");
writer.WriteLine();
}
}
}

protected override object SaveViewState()
{
object[] objs = new object[2];
objs[0]= base.SaveViewState ();
System.Collections.ArrayList list = new ArrayList();
objs[1]= list;
foreach(ListItem item in this.Items)
{
System.Collections.Hashtable hash = new Hashtable();
foreach(Object key in item.Attributes.Keys)
{
hash.Add(key,item.Attributes[key.ToString()]);
}
list.Add(hash);
}
return objs;
}
protected override void LoadViewState(object savedState)
{
object[] objs = (Object[])savedState;
base.LoadViewState (objs[0]);
System.Collections.ArrayList list = (System.Collections.ArrayList)objs[1];
for(int i =0;i< list.Count;i++)
{
System.Collections.Hashtable hash = (System.Collections.Hashtable)list[i];
foreach(object key in hash.Keys)
{
Items[i].Attributes.Add(key.ToString(),hash[key].ToString());
}
}

}



}
chang110cn 2005-08-10
  • 打赏
  • 举报
回复
好多星星,眼都花了.....
还得多努力呀.
hackate 2005-08-10
  • 打赏
  • 举报
回复
楼上这个方法,也挺不错的,谢谢!!

本来想结帖了,不过再挂到晚上.就结帖!

先再加些分上帖子再说....
henryfan1 2005-08-10
  • 打赏
  • 举报
回复
ddl.items.add(new listitem("文本","值","颜色等"))
ListItem不允许派生,所以只能用别的方法,可以创建一个ListItem工厂.

public class ListItemFactory
{
private ListItemFactory()
{
}
private ListItemFactory mSingleObj =null;
public ListItemFactory SingleObj
{
get
{
if(mSingleObj == null)
mSingleObj = new ListItemFactory();
return mSingleObj;
}
}
public System.Web.UI.WebControls.ListItem Create(string name)
{
return new System.Web.UI.WebControls.ListItem(name);
}
public System.Web.UI.WebControls.ListItem Create(string name,string value)
{
return new System.Web.UI.WebControls.ListItem(name,value);
}
public System.Web.UI.WebControls.ListItem Create(string name,string value,string color)
{
System.Web.UI.WebControls.ListItem item = Create(name,value);
item.Attributes.Add("style","color:"+color +";");
return item;
}
}
bugsbuddy 2005-08-09
  • 打赏
  • 举报
回复
继承DropDownList,新增一个string[] ColorArray的属性,
重写DropDownList控件的Render方法,如下:
System.Text.StringBuilder sbHtml = new System.Text.StringBuilder(32);
System.IO.StringWriter tw = new System.IO.StringWriter(sbHtml);
System.Web.UI.HtmlTextWriter htw = new HtmlTextWriter(tw);
base.RenderControl(htw);
int nIdx = 0;
int i = 0;
while (nIdx = sbHtml.ToString().IndexOf("<option",nIdx) > -1)
 {
nIdx += 6;
sbHtml = sbHtml.Insert(nIdx," style=\"COLOR:"+ ColorArray[i] +"\"");
 }
writer.Write(sbHtml.ToString());
hackate 2005-08-09
  • 打赏
  • 举报
回复
现在SP1234大哥,给出一个方法,是用ArrayList数组解决的方式,,十分感谢
解决了问题了!不过想在这里看看大家还有什么好方法,也来这里发表一下,谢谢!
TechEye 2005-08-09
  • 打赏
  • 举报
回复
其实自己完全写一个也不难啊,用ArrayList存Option..
henryfan1 2005-08-09
  • 打赏
  • 举报
回复
ListItem实现了 IAttributeAccessor接口,应该可以实现这样的功能.
ListItem.Attributes.Add("style","COLOR:#ff3f6f")
试下
lhcoolhacker 2005-08-09
  • 打赏
  • 举报
回复
重写DropDownList控件的Render事件。
在Render事件中,改变其输出的option
hackate 2005-08-09
  • 打赏
  • 举报
回复
谢谢楼上的支持!
peterHunter 2005-08-09
  • 打赏
  • 举报
回复
呵呵,只能关注
daishengs 2005-08-09
  • 打赏
  • 举报
回复
楼主好谦虚哦,可惜我解决不了
lovebanyi 2005-08-09
  • 打赏
  • 举报
回复
#ddl option
{color:#CC6633;
}
</style>

倒。有了车轮你还造车轮啊。 用个CSS控制就OK了
hedonister 2005-08-09
  • 打赏
  • 举报
回复
潜水好久,冒个头喘气学习
adandelion 2005-08-09
  • 打赏
  • 举报
回复
楼主好谦虚!向搂主学习!!!!
偶菜,帮顶~~~~
saucer 2005-08-09
  • 打赏
  • 举报
回复
that was a bug, see

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q309338
hackate 2005-08-09
  • 打赏
  • 举报
回复
没关系!呵呵,原来我在测试楼上这个方法出错了,怪不得!

现在两种解决方式了,期待新的方法,和更简洁的方法,恩..
henryfan1 2005-08-09
  • 打赏
  • 举报
回复
不好意思公司的网有站,补答.
这个是通过测试的了
public class MyDrop :DropDownList
{
protected override void RenderContents(HtmlTextWriter writer)
{
ListItemCollection listItemCollection = base.Items;
int i = base.Items.Count;
bool flag = false;
if (i > 0)
{
for (int j = 0; j < i; j++)
{
ListItem listItem = listItemCollection[j];
writer.WriteBeginTag("option");
if (listItem.Selected)
{
if (flag)
{
throw new HttpException("Cant_Multiselect_In_DropDownList");
}
flag = true;
writer.WriteAttribute("selected", "selected", false);


}
writer.WriteAttribute("value", listItem.Value, true);
System.Web.UI.AttributeCollection attributeCollection = listItem.Attributes;
IEnumerator iEnumerator = attributeCollection.Keys.GetEnumerator();
while (iEnumerator.MoveNext())
{
string str2 = (String)iEnumerator.Current;
writer.Write(" "+str2+"=\""+attributeCollection[str2]+"\"");
}
writer.Write('>');
HttpUtility.HtmlEncode(listItem.Text, writer);
writer.WriteEndTag("option");
writer.WriteLine();
}
}
}
}
soft_biao 2005-08-09
  • 打赏
  • 举报
回复
mark
加载更多回复(18)
内容概要:本文围绕“基于改进秃鹰算法的微电网群经济优化调度”展开研究,利用Matlab代码实现优化算法的仿真与复现。研究重点在于通过改进的秃鹰搜索算法(Bald Eagle Search Algorithm, BESA)解决微电网群在运行过程中的经济调度问题,提升算法的收敛速度与全局寻优能力,以实现对分布式能源、储能系统及负荷的高效协调管理。文中详细阐述了微电网群的系统架构、数学建模过程、目标函数设计(如运行成本最小化、碳排放降低等),并结合智能优化算法进行求解,验证了改进算法相较于传统方法在调度精度和效率方面的优越性。同时,研究还探讨了算法在多场景下的适应性,为微电网群的智能化、低碳化运行提供了技术支持与实践参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、智能优化算法相关工作的工程技术人员。; 使用场景及目标:① 学习并掌握改进秃鹰算法在复杂优化问题中的应用方法;② 实现微电网群经济调度模型的构建与求解;③ 对比不同智能算法在电力系统优化中的性能表现;④ 为科研论文复现、课题研究或工程项目提供算法支持与代码参考。; 阅读建议:建议读者结合文中提供的Matlab代码逐模块分析,重点关注算法改进策略与调度模型的耦合实现方式,同时可尝试在不同参数设置或场景条件下进行仿真实验,以加深对算法性能与调度效果的理解。
内容概要:本文围绕多旋翼无人机姿态估计算法的开发与性能评估展开系统性研究,重点对比了线性与非线性滤波算法在复杂飞行环境下的表现。通过构建基于扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)等先进算法的姿态估计器,融合IMU、磁力计、视觉传感器等多源数据,有效提升了姿态解算的精度与鲁棒性。研究涵盖了静态悬停、高速机动及磁干扰等多种典型飞行场景,利用MATLAB/Simulink平台完成仿真实验,并结合实测飞行数据与VICON高精度运动捕捉系统提供的真值进行定量分析。结果表明,非线性滤波器在动态工况下具有显著优势,尤其在抑制漂移和抵抗外部干扰方面优于传统线性方法。文章还提出了传感器融合、自适应建模、冗余配置等一系列降低偏差影响的技术路径,为高可靠性无人机导航系统的设计提供了理论依据与实践指导。; 适合人群:具备控制理论、信号处理及状态估计基础知识,从事无人机导航、控制算法研发或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于开发高精度无人机姿态解算模块;②为多传感器融合算法的设计、实现与验证提供参考案例;③服务于复杂环境下无人系统状态估计的教学演示与科研攻关; 阅读建议:建议结合文中所述MATLAB/Simulink仿真模型与实测数据集进行复现与调试,重点关注EKF与UKF的数学推导、实现细节及关键参数调优过程,深入理解非线性系统建模、状态估计与工程实际之间的平衡与折衷。

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧