您的位置:首页 > 其它

VisualStudio2008环境下,使用WebPart实现自定义页面布局

2010-09-07 11:00 387 查看
VisualStudio2008环境下WebPart使用小结

A.使用WebPart的页面必须放置一个WebPartManager,用来管理页面上所有的WebPart,还可以设置

WebPart页的模式,字段布局页面只用到了两个状态,如下

LayoutWebPartManager.DisplayMode = WebPartManager.DesignDisplayMode;

LayoutWebPartManager.DisplayMode = WebPartManager.BrowseDisplayMode;

上面的两行代码分别将页面的显示模式设置为设计模式和浏览模式,设计模式下,可以将一个WebPart

拖动到页面上的任意一个WebPartZone中,在浏览模式下,可以看到拖动后页面的布局效果。

B.拖动WebPart时会触发WebPartManager的WebPartMoving事件,在这个事件中,可以利用参数

WebPartMovingEventArgs e取得如下内容

① 正在移动WebPart e.WebPart

② 借助WebPartManager取得正在移动WebPart的Index

int nWebPartIndex = LayoutWebPartManager.WebParts.IndexOf(e.WebPart);

③ 移动后WebPart所在的目标区域 e.Zone

④ 借助WebPartManager取得移动后WebPart所在的目标区域的Index

int nZoneIndex = LayoutWebPartManager.Zones.IndexOf(e.Zone) ;

⑤ 移动后WebPart在目标区域所处的位置 e.ZoneIndex

⑥ 满足一定的条件时,可以通过e.Cancel = true取消该事件

C.拖动WebPart成功后会触发WebPartManager的WebPartMoved事件,在这个事件中可以做一些移动成

功后需要处理的事情。比如在元素字段布局页面移动字段对应的WebPart成功后,它所在WebPartZone

中的所有WebPart的位置序号Index需要重新设置,保证这些位置序号Index连续。

D .利用WebPartManager的DeleteWebPart方法清除WebPartManager自己在WebPartZone加载的控件,

如下:

foreach (WebPartZone wpzItem in LayoutWebPartManager.Zones)

{

for (int n = wpzItem.WebParts.Count - 1; n >= 0; n--)

{

LayoutWebPartManager.DeleteWebPart(wpzItem.WebParts
);

}

}

E.利用WebPartManager的AddWebPart方法在WebPartZone中动态加载控件,这个方法需要三个参数,

第一个是需要加载的WebPart控件--WebPart webPart,第二个参数指定在哪个WebPartZone中添加--

WebPartZoneBase zone,第三个参数决定加到WebPartZone中的哪个位置--int zoneIndex,如下:

AddWebPartToZone(WebPart wpItem)

{

int zonePosition = Convert.ToInt32(wrpItem.zonePosition);

string strZoneID = "WebPartZone" + wrpItem.zoneInex;

WebPartZoneBase wpZone = LayoutWebPartManager.Zones[strZoneID];

LayoutWebPartManager.AddWebPart(wpItem, wpZone, zonePosition);

}

F.动态加载控件之后用FindControl方法通过ID找到对应控件,再设置这个控件的一些属性。如果在

加到WebPartZone之前,将WebPart中的控件的属性设置好后再加到WebPartZone中,会出现奇怪的问题

,目前也不知道为什么。

// 设置WebPart中Label的显示内容

Control ctrLabel = LayoutWebPartManager.Zones[strZoneID].WebParts

[zonePosition].FindControl("DisplayContent");

if (ctrLabel != null)

{

Label lbl = ctrLabel as Label;

lbl.Text = wrpItem.displayName;

}

// 设置WebPart中DropDownList的宽度

Control ctrInput = LayoutWebPartManager.Zones[strZoneID].WebParts

[zonePosition].FindControl("InputControl");

if (ctrInput != null)

{

DropDownList ddl = ctrInput as DropDownList;

ddl.Width = Convert.ToInt32(wrpItem.defaultWidth);

}

G.修改WebPartZone的标题和WebPartZone中没有控件时的提示信息,如下:

private void ModifyEmptyZoneText()

{

int nIndex = 1;

foreach (WebPartZone item in LayoutWebPartManager.Zones)

{

// WebPartZone的标题

item.HeaderText = PCConst.ELEMENTLAYOUTSET_WEBPARTZONE_HEADERTEXT +

nIndex.ToString();

// WebPartZone中没有控件时的提示信息

item.EmptyZoneText = PCConst.ELEMENTLAYOUTSET_WEBPARTZONE_EMPTYZONETEXT;

nIndex++;

}

}

H.动态生成WebPart

字段布局页面中使用WebPart布局,由于通过WebPartManager的AddWebPart方法只能在WebPartZone中

加入WebPart控件,所以将每个自定义字段类型对应的控件都封装成为一个独立的WebPart类,如下

public class FloatTextBoxWP : VWebPart

{

VTextBoxValidator txtInput;

public FloatTextBoxWP()

: base()

{

}

protected override void CreateChildControls()

{

base.CreateChildControls();

tdControl = new TableCell();

txtInput = new VTextBoxValidator();

txtInput.ID = "InputControl";

txtInput.MatchType = VTextBoxValidator.enMatchType.DecimalNumber;

Panel pnl = new Panel();

pnl.Controls.Add(txtInput);

pnl.Enabled = false;

tdControl.Controls.Add(pnl);

trItem.Cells.Add(tdControl);

this.Controls.Add(trItem);

ChildControlsCreated = true;

}

}

在页面中使用WebPartManager的AddWebPart方法动态加载WebPart

LayoutWebPartManager.AddWebPart(wpItem, wpZone, zonePosition);

第一个参数是动态生成的WebPart控件,第二个参数是页面上放置的某个WetPartZone(目前由于无法动

态生成WetPartZone,所以在页面上静态放置了足够多的WetPartZone);第三个参数是WebPart在

WebPartZone中的位置。

在PageLoad事件中也需要每次都重新加载一次WebPart,否则找不到WebPart中的控件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: