标题:用托管C++编写自定义Web组合控件(2)
时间:2006-7-31 来源:酷网动力 浏览数:次
代码如下:
String *SearchControl::get_LabelText()
{
this->EnsureChildControls();
return label->Text;
}
void SearchControl::set_LabelText(String *value)
{
this->EnsureChildControls();
label->Text = value;
}
String *SearchControl::get_Value()
{
this->EnsureChildControls();
return textbox->Text;
}
void SearchControl::set_Value(String *value)
{
this->EnsureChildControls();
textbox->Text = value;
}
String *SearchControl::get_ButtonText()
{
this->EnsureChildControls();
return button->Text;
}
void SearchControl::set_ButtonText(String *value)
{
this->EnsureChildControls();
button->Text = value;
}
上述代码最棘手的部分就是EnsureChildControls()方法,其保证了子控件在之前已经被创建,如果你不添加这个,设计器将会显示一个空白的自定义控件。 当你运行上述代码时,将会发现一些设计上的缺陷。首先,文本框总是同样大小,并且不能排列多于一个SearchControl实例的标签。为进行修正,要添加第四个服务端控件到自定义Web组合控件中,在此,表格(Table)可能是处理所有控件布局问题最好的方法:
void SearchControl::CreateChildControls()
{
System::Web::UI::WebControls::Table *table = new Table();
TableRow *row = new TableRow();
TableCell *cell1 = new TableCell();
TableCell *cell2 = new TableCell();
TableCell *cell3 = new TableCell();
cell1->Controls->Add(label);
cell2->Controls->Add(textbox);
cell3->Controls->Add(button);
row->Cells->Add(cell1);
row->Cells->Add(cell2);
row->Cells->Add(cell3);
table->Rows->Add(row);
Controls->Add(table);
}
为处理排列问题,需再再添加两个属性:LabelWidth和LabelAlign。LabelWidth保证了标签控件为一特定的单位长度,而LabelAlign允许标签使用HorizontalAlign枚举进行排列:
[Bindable(true), Category("Appearance")]
__property void set_LabelWidth(Unit value);
__property Unit get_LabelWidth();
[Bindable(true), Category("Appearance")]
__property void set_LabelAlign(HorizontalAlign value);
__property HorizontalAlign get_LabelAlign();
现在问题又有些棘手了,为指定标签的宽度与排列,可对表格单元格属性进行修改,但在单元格中并不包含标签自身。为简化起见,创建一个名为cellLabel的私有类变量,由其取代CreateChildControls()方法中的cell1,以下是LabelWidth与LabelAlign属性的实现代码:
Unit SearchControl::get_LabelWidth()
{
this->EnsureChildControls();
return cellLabel->Width;
}
void SearchControl::set_LabelWidth(Unit value)
{
this->EnsureChildControls();
cellLabel->Width = value;
}
HorizontalAlign SearchControl::get_LabelAlign()
{
this->EnsureChildControls();
return cellLabel->HorizontalAlign;
}
void SearchControl::set_LabelAlign(HorizontalAlign value)
{
this->EnsureChildControls();
cellLabel->HorizontalAlign = value;
}
处理文本框的缩放时,可使它完全充满包含其的单元格,这样,当表格缩放时,文本框也会跟着缩放。于是,当控件缩放时,文本框会随控件变化,或者你可以指定标签为控件的一个百分比,如30%,这样一来,当控件缩放时,标签与文本框都会基于百分比进行调整,以下是修改后的CreateChildControls()方法:
void SearchControl::CreateChildControls()
{
System::Web::UI::WebControls::Table *table = new Table();
TableRow *row = new TableRow();
TableCell *cell2 = new TableCell();
TableCell *cell3 = new TableCell();
cellLabel->Controls->Add(label);
textbox->Width = Unit::Percentage(100);
cell2->Controls->Add(textbox);
cell3->Controls->Add(button);
row->Cells->Add(cellLabel);
row->Cells->Add(cell2);
cell3->Width = Unit::Percentage(1);
row->Cells->Add(cell3);
table->Rows->Add(row);
table->Width = Unit::Percentage(100);
Controls->Add(table);
}
另外,别忘了在构造函数中创建labelCell的实例,要不然可要花点时间找出为什么设计器会给你一个大大的错误提示框了。
(责任编辑:笑虎)