【问题标题】:Creating a mailto link in codebehind for a dynamically generated gridview在代码隐藏中为动态生成的 gridview 创建 mailto 链接
【发布时间】:2014-08-06 15:25:09
【问题描述】:

我正在为我的学校开发内部目录服务,但在从代码隐藏动态生成的 gridview 上创建“mailto:”链接时遇到问题。

在对此进行了一段时间的修改后,我发现超链接字段不支持“:”字符-使得“mailto:”链接不可能。

因为我正在动态生成 Gridview 以允许按标题分组,所以我在代码隐藏中完成所有操作。 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";
        }
    }
}

【问题讨论】:

  • 感谢您的建议,刚刚试了一下。没用:/

标签: c# asp.net linq gridview


【解决方案1】:

好的,抱歉,您需要切换到绑定字段与 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;

这应该可以解决您的问题。

【讨论】:

  • 是的,这确实有效,但是我不能在一个边界域上拥有两组不同的数据。它显示电子邮件地址 - dt.Columns[4].ToString(),而不是名称 - dt.Columns[1].ToString()。我现在意识到我没有在我的问题中指定这一点。
  • 这是我能找到的最接近的地方,需要将控件设置为 ItemTemplate stackoverflow.com/a/4920818/941398
  • 有没有办法严格从后端做到这一点?
  • 是的,但这是一种皇家的痛苦。您必须创建一个实例化 ITemplate 接口的模板类,然后创建绑定等。这是一个链接forums.asp.net/t/…
  • 我制作了模板,它可以工作了!由于我编写它的方式,我仍然无法隐藏空的 mailto 链接,但我正在努力。
【解决方案2】:

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

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

或者它的一些变体?

【讨论】:

  • 同样的问题。除非在“mailto”之后删除冒号,否则该链接显示为不可点击。
  • 那么怎么样:hlName.DataTextField = "dt.Columns[1].ToString ()";
  • 好吧,因为冒号是让它不起作用的想法,我认为更改数据并不重要。这与之前的代码行基本相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多