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

来源:互联网 发布:京东金融数据分析 编辑:程序博客网 时间:2024/05/06 01:50

 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[n]);

            }

        }

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中的控件。

原创粉丝点击