關于自定義控件設計時如何把屬性寫入aspx中的研究(下)
雖然這一篇已經是“下”了,但是我并沒有研究清楚“自定義控件設計時如何把屬性寫入到aspx中”這個問題。
不過,我選擇了另外一條路,做了點手腳,讓控件把屬性寫入到aspx中去了。
其實,即使有人肯定的告訴我,在上篇中提到的ControlSerializer類的SerializeControl方法就是用于把控件屬性寫入到aspx中去的,我也實在沒辦法利用它,它的位置太“深”了。
我是通過重寫GridView的Columns屬性來實現的。我當時想,即使實例A(如果不明白實例A指什么,請看上篇http://www.rzrgm.cn/nnhy/archive/2007/04/05/701485.html)從來不調用CreateColumns方法,但是,它肯定要調用Columns屬性吧。重載該屬性,并輸出日志,果然,有很少的幾次調用。不過,已經夠了。
我的做法就是,在這個屬性的get方法里面,強制改變各列的屬性,再返回。設計器在生成控件的aspx時,至少要讀取Columns來生成各個列吧。
主要代碼如下:
CreateEntryColumns就是我用來改變列屬性的方法,之前的幾個判斷,是為了防止列屬性被頻繁改變。我只需要在綁定數據源之后改變就可以了。
語句if (ng.GetHashCode() == this.GetHashCode()),通過判斷當前對象和A對象的HashCode,來判斷是否是同一個實例,也就是說,我要求這個重載,只在實例A中生效。
最后的結果,還挺令人滿意的。目前正在想法子重載DetailView和FormView
不過,我選擇了另外一條路,做了點手腳,讓控件把屬性寫入到aspx中去了。
其實,即使有人肯定的告訴我,在上篇中提到的ControlSerializer類的SerializeControl方法就是用于把控件屬性寫入到aspx中去的,我也實在沒辦法利用它,它的位置太“深”了。
我是通過重寫GridView的Columns屬性來實現的。我當時想,即使實例A(如果不明白實例A指什么,請看上篇http://www.rzrgm.cn/nnhy/archive/2007/04/05/701485.html)從來不調用CreateColumns方法,但是,它肯定要調用Columns屬性吧。重載該屬性,并輸出日志,果然,有很少的幾次調用。不過,已經夠了。
我的做法就是,在這個屬性的get方法里面,強制改變各列的屬性,再返回。設計器在生成控件的aspx時,至少要讀取Columns來生成各個列吧。
主要代碼如下:
1
/// <summary>
2
/// 已重寫。獲取表示 GridView 控件中列字段的 DataControlField 對象的集合。
3
/// 重寫以實現設計時把英文表頭轉為中文、列重新排序、列寬度調整
4
/// </summary>
5
public override DataControlFieldCollection Columns
6
{
7
get
8
{
9
DataControlFieldCollection cs = base.Columns;
10
if (cs == null || cs.Count < 1 || Site == null || Site.Component == null) return cs;
11
SetDefaultStype(cs);
12
NGridView ng = Site.Component as NGridView;
13
if (ng == null || !ng.DesignMode) return cs;
14
try
15
{
16
if (ng.GetHashCode() == this.GetHashCode())
17
{
18
//if (isEntryCreating || !(isChanged || AutoGenerateDeleteButton || AutoGenerateEditButton || AutoGenerateSelectButton)) return cs;
19
if (isEntryCreating) return cs;
20
//SetDefaultStype(cs);
21
if (!isChanged) return cs;
22
isEntryCreating = true;
23
CreateEntryColumns(cs);
24
}
25
}
26
catch (Exception ex) { MessageBox.Show(ex.Message, "NGridView"); }
27
finally
28
{
29
isEntryCreating = false;
30
isChanged = false;
31
}
32
return cs;
33
}
34
}
35
/// <summary>2
/// 已重寫。獲取表示 GridView 控件中列字段的 DataControlField 對象的集合。3
/// 重寫以實現設計時把英文表頭轉為中文、列重新排序、列寬度調整4
/// </summary>5
public override DataControlFieldCollection Columns6
{7
get8
{9
DataControlFieldCollection cs = base.Columns;10
if (cs == null || cs.Count < 1 || Site == null || Site.Component == null) return cs;11
SetDefaultStype(cs);12
NGridView ng = Site.Component as NGridView;13
if (ng == null || !ng.DesignMode) return cs;14
try15
{16
if (ng.GetHashCode() == this.GetHashCode())17
{18
//if (isEntryCreating || !(isChanged || AutoGenerateDeleteButton || AutoGenerateEditButton || AutoGenerateSelectButton)) return cs;19
if (isEntryCreating) return cs;20
//SetDefaultStype(cs);21
if (!isChanged) return cs;22
isEntryCreating = true;23
CreateEntryColumns(cs);24
}25
}26
catch (Exception ex) { MessageBox.Show(ex.Message, "NGridView"); }27
finally28
{29
isEntryCreating = false;30
isChanged = false;31
}32
return cs;33
}34
}35

CreateEntryColumns就是我用來改變列屬性的方法,之前的幾個判斷,是為了防止列屬性被頻繁改變。我只需要在綁定數據源之后改變就可以了。
語句if (ng.GetHashCode() == this.GetHashCode()),通過判斷當前對象和A對象的HashCode,來判斷是否是同一個實例,也就是說,我要求這個重載,只在實例A中生效。
最后的結果,還挺令人滿意的。目前正在想法子重載DetailView和FormView
我不相信神話,我只相信汗水!我不相信命運,我只相信雙手!



浙公網安備 33010602011771號