在代码后面创建一个mailto链接,用于动态生成的gridview

时间:2014-06-16 18:25:28

标签: c# asp.net linq 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";
        }
    }
}

2 个答案:

答案 0 :(得分:0)

很好奇,你有没有试过这样的事情:

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

或其中的一些变体?

答案 1 :(得分:0)

好的抱歉,您需要切换到绑定字段与mailto的超链接字段。显然,&#34;:&#34;存在问题。在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;

那可以解决你的问题。