有这样一个自定义控件,在同一个页面上它的某个属性必须彼此不同,否则就会在最终生成的HTML上面引发错误。我想做到当开发者从toolbox把控件拖到页面上的时候该控件能自动检查该页面上的其他同类控件,从而选择一个尚未使用的值给那个属性赋值,有点类似控件的ID,每次添加一个控件的时候ID会从Ctr1变成Ctr2等等。但是该如何做呢?之前的一种做法
[Bindable(true)]
[Category("Custom")]
[DefaultValue("1")]
[Localizable(true)]
public int StepIndex
{
get
{
int index = 1;
if (ViewState["StepIndex"] != null)
{
index = (int)ViewState["StepIndex"];
}
else
{
if (HttpContext.Current == null)
{
//循环遍历Page上的所有同类控件,并选择一个尚未使用的值给其赋值。假设其为10
index = 10;
}
}
return index;
} set
{
ViewState["StepIndex"] = value;
}
}这么做之后在属性窗口里的确能看到该属性的默认值在自动增加,但是在察看aspx源码的时候却只能看到<cc1:MyControl ID="MyControl1" runat="server"></cc1:MyControl>,该属性并没有被真正赋值。之后在该类的ToolboxData里面写了[ToolboxData("<{0}:MyControl runat=Server StepIndex='1'></{0}:MyControl >")]。发现这么做之后,当拖控件进页面的时候,该属性(StepIndex)的值被固定在1上了,之前写的检测和赋值代码没有发挥作用。谁能帮忙看看吗?谢谢!
[Bindable(true)]
[Category("Custom")]
[DefaultValue("1")]
[Localizable(true)]
public int StepIndex
{
get
{
int index = 1;
if (ViewState["StepIndex"] != null)
{
index = (int)ViewState["StepIndex"];
}
else
{
if (HttpContext.Current == null)
{
//循环遍历Page上的所有同类控件,并选择一个尚未使用的值给其赋值。假设其为10
index = 10;
}
}
return index;
} set
{
ViewState["StepIndex"] = value;
}
}这么做之后在属性窗口里的确能看到该属性的默认值在自动增加,但是在察看aspx源码的时候却只能看到<cc1:MyControl ID="MyControl1" runat="server"></cc1:MyControl>,该属性并没有被真正赋值。之后在该类的ToolboxData里面写了[ToolboxData("<{0}:MyControl runat=Server StepIndex='1'></{0}:MyControl >")]。发现这么做之后,当拖控件进页面的时候,该属性(StepIndex)的值被固定在1上了,之前写的检测和赋值代码没有发挥作用。谁能帮忙看看吗?谢谢!
==========
要从这里入手,为什么会产生错误?肯定会有解决办法的
那个属性实际上是定义了一套执行顺序,按规矩来说是输入1,2,3就好,但是使用者总是忘记输入,结果在输出到最终HTML的时候就报javascript错,最后找上我说这个做的不好,要改进到上面说的自动更新的那种。
=====>
ClientID
{
//循环遍历Page上的所有同类控件,并选择一个尚未使用的值给其赋值。假设其为10
index = 10;
}==========
因为这个代码就是设计时才运行.
这个控件在HTML上对应了一个JavaScript控件,这个控件的若干属性就是那个js对象的若干属性。如果那些个js对象的某个属性不唯一,就会出现js错误。
能给个参考文献么?
在Initialize( IComponent component );函数里处理 component 就是你的控件实例
可以通过它取得当前控件的属性
再通过
ComponentCollection documentComponents = this.Component.Site.Container.Components;
获得设计时页面所有元素分析
按照你的做法已经能成功取到该控件的属性,设置这个属性后在该控件的property窗口中看到该属性的确已经被设置成功。然而察看aspx源码的时候看到那个属性还是没有被设置,还是<cc1:MyControl ID="MyControl1" runat="server"></cc1:MyControl>,即该属性并没有被真正赋值。这个该如何解决?