如何在SPGridView中设置超链接字段的navigationUrl

问题描述:

我想要获取根网站下的所有网站集并使用SPGridView显示它们。在SPGridView中,我使用HyperlinkField显示名称,网址并为每个网站创建。 我的问题是我无法将该网站的URL附加到HyperlinkField。任何想法如何可以在代码中完成?如何在SPGridView中设置超链接字段的navigationUrl

[ToolboxItemAttribute(false)] 
public class SPGridViewDemo : WebPart 
{ 
    private SPGridView grid; 
    private ObjectDataSource gridDS; 

    public DataTable SelectData() 
    { 
     DataTable dataSource = new DataTable(); 

     dataSource.Columns.Add("Name"); 
     dataSource.Columns.Add("Created"); 
     dataSource.Columns.Add("Url"); 

     SPWebApplication webApplication = SPContext.Current.Site.WebApplication; 
     SPSiteCollection siteCollections = webApplication.Sites; 
     SPSite currentSite = SPContext.Current.Site; 

     foreach (SPSite siteCollection in siteCollections) 
      { 
       dataSource.Rows.Add(siteCollection.RootWeb.Title, siteCollection.RootWeb.Created, siteCollection.RootWeb.Url); 
      } 

     return dataSource; 
    } 


    protected sealed override void Render(HtmlTextWriter writer) 
    { 
     BoundField column = new BoundField(); 
     HyperLinkField hyplink = new HyperLinkField(); 

     hyplink.DataTextField = "Name"; 
     hyplink.NavigateUrl = "Url"; 
     hyplink.SortExpression = "Name"; 
     hyplink.HeaderText = "Workspaces"; 
     grid.Columns.Add(hyplink); 

     column = new BoundField(); 
     column.DataField = "Created"; 
     column.SortExpression = "Created"; 
     column.HeaderText = "Created"; 
     grid.Columns.Add(column); 

     column = new BoundField(); 
     column.DataField = "Url"; 
     column.SortExpression = "Url"; 
     column.HeaderText = "Url"; 
     grid.Columns.Add(column); 

     grid.Sort("Name",System.Web.UI.WebControls.SortDirection.Descending); 
     grid.DataBind(); 

     base.Render(writer); 
    } 

    protected sealed override void CreateChildControls() 
    { 
     const string gridId = "grid"; 
     const string dataSourceId = "gridDS"; 

     gridDS = new ObjectDataSource(); 
     gridDS.ID = dataSourceId; 
     gridDS.SelectMethod = "SelectData"; 
     gridDS.TypeName = this.GetType().AssemblyQualifiedName; 
     gridDS.ObjectCreating += new ObjectDataSourceObjectEventHandler(gridDS_ObjectCreating); 
     this.Controls.Add(gridDS); 

     grid = new SPGridView(); 
     grid.ID = gridId; 
     grid.DataSourceID = gridDS.ID; 
     grid.AutoGenerateColumns = false; 

     // Paging 
     grid.AllowPaging = true; 
     grid.PageSize = 5; 

     // Sorting 
     grid.AllowSorting = true; 

     this.Controls.Add(grid); 

     SPGridViewPager pager = new SPGridViewPager(); 
     pager.GridViewId = grid.ID; 

     this.Controls.Add(pager); 
    } 

    private void gridDS_ObjectCreating(object sender, ObjectDataSourceEventArgs e) 
    { 
     e.ObjectInstance = this; 
    } 
+0

您的代码缺少关键信息:Url来自哪里?你是否收到错误?按照你的方式,'.NavigateUrl'只是空的?当您将'.NavigateUrl'设置为像google.com这样的随机URL时会发生什么? – 2011-12-20 11:35:12

+0

我添加了上面的代码。 – 2011-12-20 11:45:25

您应该使用HyperLinkField.DataNavigateUrlFields Property代替:

HyperLinkField hyplink = new HyperLinkField(); 

hyplink.DataTextField = "Name"; 
hyplink.DataNavigateUrlFields = new string[] { "Url" }; 
hyplink.SortExpression = "Name"; 
hyplink.HeaderText = "Workspaces"; 
grid.Columns.Add(hyplink); 

HyperLinkField.NavigateUrl Property用于呈现静态URL:

使用NavigateUrl属性来指定网址导航到当一个超链接在HyperLinkField对象中单击。设置此属性时,每个超链接共享相同的导航URL。

+0

嗨Stefan。感谢您的回复。你说的是对的。我用它是这样的:DataNavigateUrlFields = new [] {“Url”}, DataNavigateUrlFormatString =“{0}”, – 2011-12-20 13:29:07

+0

根据文档'DataNavigateUrlFormatString'对于基本显示是不需要的。 – Stefan 2011-12-20 14:18:02