其实这篇文章本不想写的,但是考虑到这件事也折腾了我大半天的,唉...记下来也给自己一个总结吧.
在用VS.NET做移动WEB开发时,很明显有一个控件是非常有用但是VS.NET却没有提供的,那就是TextArea,多行输入.
我Google了一下,发现有一篇文章介绍如何自定义这个控件,
原文在这里. 另外,在asp.net网站也有一个现成的控件可以下载,
参考这里.
大家可以直接去看我上面提供的两个链接,也可以接着往下看,我会先简要地介绍一下代码开发,然后重点是总结在配置方面的问题.而这一点,上面老外的文章中却言之甚少.
开发一个自定义控件,要自己实现两个类,一是派生于某个控件的你想要的控件类,二是负责将这个控件Render出来的适配器类(Adapter).
首先,我们实现一个叫MultiLineTextBox类,派生于TextBox类,比较简单,就是多了两个属性Cols和Rows.代码如下:
public
class
MultiLineTextBox:System.Web.UI.MobileControls.TextBox

{

privateint_cols=0;
publicintCols


{

get
{returnthis._cols;}

set
{this._cols=value;}
}
privateint_rows=0;
publicintRows


{

get
{returnthis._rows;}

set
{this._rows=value;}
}
}
当然你也可以象老外文章那样,直接把两个属性值放在ViewState中,如果你不打算在你的程序中禁用ViewState的话,这应该是一个更好的办法.
第二步,实现一个派生于ControlAdapter的MultiLineTextBoxAdapter类,重载一个属性和一个方法即可.代码如下:
public
class
HTMLMultiLineTextBoxAdapter:System.Web.UI.MobileControls.Adapters.ControlAdapter

{
protectednewMultiLineTextBoxControl


{

get
{return(MultiLineTextBox)base.Control;}
}

publicoverridevoidRender(HtmlTextWriterwriter)


{
writer.WriteBeginTag("textarea");

StringrenderName;
if(Device.RequiresAttributeColonSubstitution)


{
renderName=Control.UniqueID.Replace(':',',');
}
else


{
renderName=Control.UniqueID;
}
writer.WriteAttribute("name",renderName);
writer.WriteAttribute("cols",Control.Cols.ToString());
writer.WriteAttribute("rows",Control.Rows.ToString());

writer.Write(">");
writer.Write(Control.Text);
writer.WriteEndTag("textarea");

}
}
属性Control的重载说明我要管理的类叫MultiLineTextBox.而重载的Render方法则具体了如何在页面中去表现这个控件,就是输出一个textarea标签.
第三步,修改web.config,增加对设备的支持,我就是在这一步被卡住了...先提交吧,下一篇再讨论.