最近做的项目需要使用SPGridView,并在SPGridView使用下拉菜单。
参考了一下这篇博客:
http://www.cnblogs.com/enjoyment/archive/2008/12/28/1364142.html
关于如何通过MenuItemTemplate的ClientOnClickNavigateUrl属性来指定此菜单项的连接,这篇文章中写得很清楚,我就不多说了。
至于如何处理菜单项的回发行为,我就看得有点晕了。后来又参考了一下这篇文章:
http://www.thesug.org/blogs/patrickr/Lists/Posts/Post.aspx?List=8afc69af%2Df9fc%2D4786%2D816f%2D6419264c42da&ID=18
总算是做出来了,下面总结一下:
1.首先需要定义一个类,该类继承自MenuItemTemplate,并实现 IPostBackEventHandler接口
代码如下:
Code
class PostBackMenuItemTemplate : MenuItemTemplate, IPostBackEventHandler
{
protected override void EnsureChildControls()
{
if (!this.ChildControlsCreated)
{
base.EnsureChildControls();
if (string.IsNullOrEmpty(this.ClientOnClickUsingPostBackEvent))
{
this.ClientOnClickUsingPostBackEventFromControl(this, "%ItemID%");//此处的"%ItemID%" 要与后面的 menuCol.TokenNameAndValueFields = "ItemID=ID"; 相对应
}
}
}
public void RaisePostBackEvent(string eventArgument)
{
MenuItemEventHandler handler = this.OnPostBack;
if (handler != null)
{
handler(eventArgument);
}
}
public event MenuItemEventHandler OnPostBack;
}
public delegate void MenuItemEventHandler(string id);
2.下面是一个例子演示了如何使用
在下面的代码中,为SPGridView添加了一个菜单列,菜单中包含一个菜单项,点击后由 mit_OnPostBack 方法处理回发
Code
protected void initSPGridView()
{
…
SPMenuField menuCol = new SPMenuField();
menuCol.TextFields = "用品名称";
menuCol.HeaderText = "用品名称";
menuCol.MenuTemplateId = "menu";
menuCol.TokenNameAndValueFields = "ItemID=ID"; //此处要与前面的 this.ClientOnClickUsingPostBackEventFromControl(this, "%ItemID%"); 相对应
MenuTemplate mt = new MenuTemplate();
mt.ID = "menu";
PostBackMenuItemTemplate mit = new PostBackMenuItemTemplate();
mit.ClientOnClickPostBackConfirmation = "你确定要删除吗?";
mit.Text = "删除";
mit.ID = "menu1";//必须要给ID赋值,否则会出错
mit.OnPostBack+=new MenuItemEventHandler(mit_OnPostBack);
mt.Controls.Add(mit);
this.Controls.Add(mt);
SPGridView1.Columns.Add(menuCol);
…
}
处理MenuItemTemplate的回发
Code
void mit_OnPostBack(string id)
{
//此处的id就是菜单对应的那个列表项的ID了,可以通过ID找到列表项并进行操作。在这个例子中,我只是用一个label来显示该ID
Label1.Text = id;
}