2014-06-16 36 views
1

我正在为我的学校的内部目录服务工作,并且在代码隐藏中在动态生成的gridview上创建“mailto:”链接时出现问题。在代码隐藏中创建一个动态生成的gridview的mailto链接

经过一段时间的修补之后,我发现Hyperlinkfields不支持“:”字符 - 使得“mailto:”链接不可能。

因为我动态生成Gridviews以允许按标题分组,所以我在代码隐藏中完成了所有工作。 Gridviews是从数据源读取创建的,并添加到aspx页面上的占位符标记以及定义该组的相应标签。

public void GenerateDynamicGVs() 
    { 
//... 
      DataTable dt = new DataTable(); 
//... 
     using (SqlDataReader dr = DBUtility.ExecuteReader(cmd, "www_ConMasterDBString")) 
     { 
      dt.Load(dr); 

      var query = dt.AsEnumerable() 
       .GroupBy(r => r.Field<string>("GroupName")) 
       .Select(grp => new 
       { 
        GroupName = grp.Key, 
       }) 
       .OrderBy(o => o.GroupName) 
       .ToList(); 

      foreach (var item in query) 
      { 

       Label NewLabel = new Label(); 
       NewLabel.Text = item.GroupName; 
       NewLabel.CssClass = "DirectoryHeaders"; 
       GridView newGV = new GridView(); 
       newGV.CssClass = "CONServices"; 
       newGV.ShowHeader = false; 
       newGV.AutoGenerateColumns = false; 
       newGV.DataSource = dt.AsEnumerable().Where(p => p.Field<string>("GroupName") == item.GroupName) 
                  .Select(p => new 
                  { 
                   id = p["id"].ToString(), 
                   EntryName = p["EntryName"].ToString(), 
                   EntryNumber = p["EntryNumber"].ToString(), 
                   EntryContact = p["EntryContact"].ToString(), 
                   Email = p["Email"].ToString(), 
                   GroupName = p["GroupName"].ToString() 
                  }); 

       HyperLinkField hlName = new HyperLinkField(); 
       BoundField bfNumber = new BoundField(); 
       BoundField bfContact = new BoundField(); 

       hlName.DataNavigateUrlFields = new string[] { dt.Columns[4].ToString() }; 
       hlName.DataTextField = dt.Columns[1].ToString(); 
       hlName.DataNavigateUrlFormatString = "mailto:{0}"; //This line executes, but is not a clickable link because of the colon. 

       bfNumber.DataField = dt.Columns[2].ToString(); 
       bfContact.DataField = dt.Columns[3].ToString(); 

       newGV.Columns.Add(hlName); 
       newGV.Columns.Add(bfNumber); 
       newGV.Columns.Add(bfContact); 

       divPlaceHolder.Controls.Add(NewLabel); 
       divPlaceHolder.Controls.Add(newGV); 

       newGV.DataBind(); 
      } 
      dr.Close(); 
     } 
    } 

有没有一种很好的方法来在代码隐藏中创建一个mailto链接?由于需要动态创建,我无法将其转换为aspx文件。我在这里错过了什么吗?任何帮助或建议,不胜感激。谢谢。

编辑:链接需要显示名称而不是电子邮件地址,需要调用数据表中的两列:[1]和[4]。

明白了,代码全部在下面。

凡我gridview的东西是:

tfName.ItemTemplate = new NameColumn(); 

这是所需的TemplateField类。这是一个有点乱用文字标签,但我对于工作的解决方案只是很高兴:

class NameColumn : ITemplate 
{ 
    public void InstantiateIn(System.Web.UI.Control container) 
    { 
     Literal lit1 = new Literal(); 
     Literal litName = new Literal(); 
     Literal lit3 = new Literal(); 
     Literal litEmail = new Literal(); 
     Literal lit5 = new Literal(); 



     lit1.Text = "<a href=\"mailto:"; 
     lit3.Text = "\">"; 
     lit5.Text = "</a>"; 

     litEmail.DataBinding += new EventHandler(LabelEmailDatabinding); 
     litName.DataBinding += new EventHandler(LabelNameDatabinding); 

     container.Controls.Add(lit1); 
     container.Controls.Add(litEmail); 
     container.Controls.Add(lit3); 
     container.Controls.Add(litName); 
     container.Controls.Add(lit5); 
    } 

    private void LabelNameDatabinding(object sender, EventArgs e) 
    { 
     Literal lit = (Literal)sender; 

     GridViewRow row = (GridViewRow)lit.NamingContainer; 

     lit.Text = DataBinder.Eval(row.DataItem, "EntryName").ToString(); 
    } 

    private void LabelEmailDatabinding(object sender, EventArgs e) 
    { 
     Literal lit = (Literal)sender; 

     GridViewRow row = (GridViewRow)lit.NamingContainer; 

     lit.Text = DataBinder.Eval(row.DataItem, "Email").ToString(); 

     if (lit.Text == null) 
     { 
      lit.Text = "test"; 
     } 
    } 
} 
+0

感谢您的建议,只是试了一下。没有工作:/ –

回答

0

好的抱歉,您需要切换到绑定字段与超链接字段的mailto。显然,DataNavigateUrlFormatString中的“:”存在问题。

参考:http://forums.asp.net/t/1014242.aspx?How+to+create+mailto+in+gridview+

所以你真正需要做的是

 BoundField hlName = new BoundField(); 

     hlName.DataField= dt.Columns[1].ToString(); 
     hlName.DataFormatString= "<a href=\"mailto:{0}\">{0}</a>"; 
     hlName.HtmlEncodeFormatString = false; 

这应该解决您的问题。

+0

是的,确实有效,但是我不能在绑定域上有两组不同的数据。它显示电子邮件地址 - dt.Columns [4] .ToString(),而不是名称 - dt.Columns [1] .ToString()。我现在意识到,我没有在我的问题中指出这一点。 –

+0

这是尽可能接近,我可以找到它,并将需要设置一个ItemTemplate控件http://stackoverflow.com/a/4920818/941398 – CBRRacer

+0

有没有什么办法可以严格从后端做到这一点? –

0

只是好奇,你有没有尝试过这样的事情:

hlName.DataNavigateUrlFormatString = "<a href=\"mailto:{0}\">{0}</a>"; 

或它的一些变化?

+0

同样的问题。该链接显示为不可点击,除非冒号在“mailto”之后被移除。 –

+0

那么怎么样: hlName.DataTextField =“dt.Columns[1].ToString()”; –

+0

好吧,因为冒号让人觉得不起作用,所以我认为改变数据并不重要。这与以前的代码基本相同。 –

相关问题