web自定义控件的一些问题,高手进

zhaoding434 2012-03-13 09:41:23
我想做一个结合我们自己数据库的orm层的一个数据控件。有一个fill(model)方法,传一个实体类(带条件)进来,然后根据这个实体类查询出结果,我最早的做法是将结果拼装成html重写RenderContents方法输出,但是后来我还要做分业的按钮。需要用到服务器控件。用这个方法添加的服务器控件执行不了按钮的click事件。于是我就重写CreateChildControls()方法来输出,把拼装的htm放到literal控件中。这样能既输出htm结果,也能有分业的按钮(能执行click事件)。这样做现在有及个问题。

1.在设计时无法看到控件
2.我之前把htm重写到RenderContents中,并且在设计类中重写GetDesignTimeHtml()来处理设计时,在设计类中无法获取到控件中的属性。
3.运行时,我点击分业的按钮(下一页)。他会先执行CreateChildControls()方法输出了内容,然后在执行click的方法,click的方法紧紧是跟新数据,但是此时CreateChildControls()已经把老数据重新输出了。我只有再次点击分业按钮后,他才显示上一次的结果。。

还有个问题。我已经将css嵌入到dll中了,并且在运行时能看到。但是在设计时看不到。。

我第一次开发自定义控件,而且也比较急,不知道我这样的做法是否正确,希望大家给我点指点。我的需求是。用户在配置了列以后,调用fill方法能填充并且分业。(现在的问题是分业查询在显示之后执行。) 还有一个我希望在设计时,能根据用户配置的列,仅把列显示在设计试图,并且能看到css样式。 希望大家不惜赐教~~~~
...全文
96 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaoding434 2012-03-13
  • 打赏
  • 举报
回复
[DefaultProperty("Columns")]
[ParseChildren(true, "Columns")]
[ToolboxData("<{0}:zdGrid_main runat=server></{0}:zdGrid_main>")]
[Designer(typeof(zdGrid_Designer)), ParseChildren(false)]
public class zdGrid_main : WebControl, INamingContainer

{
//重写外层标签为Div
public override void RenderBeginTag(HtmlTextWriter writer)
{
writer.RenderBeginTag(HtmlTextWriterTag.Div);
}

//创建列的集合属性
private List<Column> _Columns;

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
// [Editor(typeof(columnEditer), typeof(UITypeEditor))]//columnEditer设计器
[Description("列的配置")]
[Category("zdGrid配置")]
[TypeConverter(typeof(PointConverter))]
public List<Column> Columns
{
get
{
if (_Columns == null)
_Columns = new List<Column>();
return _Columns;
}
}


bool _isPaging = true;
[Bindable(true)]
[Category("zdGrid配置")]
[Description("是否分页")]
[DefaultValue("")]
[Localizable(true)]
public bool IsPaging
{
get
{
return _isPaging;
}

set
{
_isPaging = value;
}
}

int _pageSize = 20;
[Bindable(true)]
[Category("zdGrid配置")]
[Description("每页显示数")]
[DefaultValue("")]
[Localizable(true)]
public int PageSize
{
get
{
return _pageSize;
}

set
{
_pageSize = value;
}
}

public enum QGridSelectMode
{
SingleSelect,
MultiSelect,
NoSelect
}
//选择模式
private QGridSelectMode _select_mode = QGridSelectMode.NoSelect;
[Bindable(true)]
[Category("zdGrid配置")]
[Description("选择模式")]
[DefaultValue("")]
[Localizable(true)]
public QGridSelectMode SelectMode
{
get
{
return _select_mode;
}
set
{
_select_mode = value;
}
}

protected override void OnPreRender(EventArgs e)
{
if (this.Page.Header.FindControl("zdGrid_Css") == null)
{
string cssUrl = Page.ClientScript.GetWebResourceUrl(this.GetType(), "zdGrid.css.css");
System.Web.UI.HtmlControls.HtmlLink link = new System.Web.UI.HtmlControls.HtmlLink();
link.Attributes["type"] = "text/css";
link.Attributes["rel"] = "stylesheet";
link.Attributes["href"] = cssUrl;
link.ID = "zdGrid_Css";
this.Page.Header.Controls.Add(link);
}
}



LinkButton lb_first = new LinkButton();
protected override void CreateChildControls()
{
Literal lit = new Literal();
string Htm = "";
Htm += "<table class='zdGrid_table'><tr><th>序号</th>";
foreach (Column col in Columns)
{
if (col.Visable == false)
Htm += "<th style='display:none'>" + col.Text + "</th>";
else
Htm += "<th>" + col.Text + "</th>";
}
Htm += "</tr>";
lit.Text = Htm;
this.Controls.Add(lit);
Htm = "";
lit = new Literal();
if (Data.Count != 0)
{
for (int i = 0; i < Data.Count; i++)
{

Htm += "<tr><td>" + (_Page.PageSize * (_Page.CurrentPage - 1) + i + 1) + "</td>";
for (int j = 0; j < Columns.Count; j++)
{
if (Columns[j].Visable)
Htm += "<td>" + getColumnValue(Columns[j].ID, Data[i]) + "</td>";
}
Htm += "</tr>";
}
if (IsPaging)
{
Htm += "<tr><th class='zdGrid_PagingTH' colspan='" + Columns.Count + 2 + "'>";
lit.Text = Htm;
this.Controls.Add(lit);
Htm = "";
lit = new Literal();
lb_first.Text = "首页";
lb_first.CommandArgument = "lb_first";
lb_first.Command += new CommandEventHandler(lb_Command);
this.Controls.Add(lb_first);
Htm += "共" + _Page.RowCount + "条记录 , 当前第" + _Page.CurrentPage + "/" + _Page.PageCount + " 页";
Htm += "</th></tr>";
lit.Text = Htm;
this.Controls.Add(lit);
Htm = "";
lit = new Literal();
}
}
Htm += "</table>";
this.Controls.Add(lit);
}


//protected override void RenderContents(HtmlTextWriter output)
//{

// string Htm = "";
// Htm += "<table class='zdGrid_table'><tr><th>序号</th>";
// foreach (Column col in Columns)
// {
// if (col.Visable == false)
// Htm += "<th style='display:none'>" + col.Text + "</th>";
// else
// Htm += "<th>" + col.Text + "</th>";
// }
// Htm += "</tr>";

// if (Data.Count != 0)
// {
// for (int i = 0; i < Data.Count; i++)
// {

// Htm += "<tr><td>" + (_Page.PageSize * (_Page.CurrentPage - 1) + i + 1) + "</td>";
// for (int j = 0; j < Columns.Count; j++)
// {
// if (Columns[j].Visable)
// Htm += "<td>" + getColumnValue(Columns[j].ID, Data[i]) + "</td>";
// }
// Htm += "</tr>";
// }
// if (IsPaging)
// {
// Htm += "<tr><th class='zdGrid_PagingTH' colspan='" + Columns.Count + 2 + "'>";
// output.Write(Htm);

// // lb_first.RenderControl(output);
// LinkButton lb_front = new LinkButton();
// lb_front.Text = "上一页";
// lb_front.CommandArgument = "lb_front";
// lb_front.Command += new CommandEventHandler(lb_Command);
// this.Controls.Add(lb_front); ;
// lb_front.RenderControl(output);
// Htm = "共" + _Page.RowCount + "条记录 , 当前第" + _Page.CurrentPage + "/" + _Page.PageCount + " 页";




// Htm += "</th></tr>";
// }
// }
// else
// {
// Htm += "<tr><th class='zdGrid_NoDataTH' colspan='" + Columns.Count + 2 + "'>无数据</th></tr>";
// }

// Htm += "</table>";

// output.Write(Htm);
//}

void lb_Command(object sender, CommandEventArgs e)
{
_Page.CurrentPage += 1;
Fill(Condition);
}





//通过反射获取列的值
private string getColumnValue(string column_name, object pojo)
{
Type t = pojo.GetType();
string method_name = getMethodName(column_name);
MethodInfo m = t.GetMethod(method_name);
string value = (string)m.Invoke(pojo, null);
return value;
}

//通过列名,生成方法名
private string getMethodName(string columnName)
{
String ret = "";
columnName = columnName.ToLower();
string lname = columnName.Substring(0, 1).ToUpper();
string uname = columnName.Substring(1);
ret = "get" + lname + uname;
return ret;
}


//数据

private ArrayList Data
{
get {
ArrayList _data=(ArrayList)ViewState["DATA"];
if (_data == null)
{
_data = new ArrayList();
}
return _data;
}
set {
ViewState["DATA"] = value;
}
}

private DBQ.entity.Pagination _Page
{
get
{
DBQ.entity.Pagination page = (DBQ.entity.Pagination)ViewState["PAGE"];

if (page == null)
{
page = new DBQ.entity.Pagination();
page.PageSize = PageSize;
page.CurrentPage = 1;

ViewState["PAGE"] = page;
}
return page;
}
}


private DBQ.BasePojo Condition
{
get{
return (DBQ.BasePojo)ViewState["condition"];
}
set
{
ViewState["condition"]=value;
}
}

public void Fill(DBQ.BasePojo pojo)
{
Condition=pojo;
Data = new DBQ.inter.BaseOperator().getList(pojo,_Page);

}

zhaoding434 2012-03-13
  • 打赏
  • 举报
回复
/// <summary>
/// 设计时支持类
/// </summary>
public class zdGrid_Designer : CompositeControlDesigner
{
//public override string GetDesignTimeHtml()
//{
// List<Column> list= (List<Column>)ShadowProperties["Columns"];
// return list.Count.ToString()+"aaa";

//}
}

62,268

社区成员

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

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

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

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