在代码隐藏中为动态生成的gridview创建一个mailto链接 [英] Creating a mailto link in codebehind for a dynamically generated gridview

查看:123
本文介绍了在代码隐藏中为动态生成的gridview创建一个mailto链接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


$ b After我发现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 =>新
{
GroupName = grp.Key,
})
.OrderBy(o => o.GroupName)
.ToList();

foreach(查询中的var项)
{

标签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 $ toString(),
EntryName = p [EntryName]。ToString(),
EntryNumber = p [EntryNumber] b $ b {
id = p [id]。 ToString(),
EntryName = p [EntryName] .ToString() ] .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}; //此行执行,但由于冒号而不是可点击的链接。

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]。

/ p>

让它工作,代码全部在下面。



其中,我的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;




解决方案

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

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



<所以你真正需要做的是
$ b $ pre $ BoundField hlName = new BoundField();

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

这可以解决您的问题。


I am working on an internal directory service for my school and am having a problem creating "mailto:" links on a dynamically generated gridview from the codebehind.

After tinkering around for a while with this, I found out that Hyperlinkfields do not support the ":" character- making "mailto:" links not possible.

Because I am dynamically generating the Gridviews to allow for grouping by header, I am doing it all in the codebehind. The Gridviews are created reading from a datasource and added to a placeholder tag on the aspx page along with a corresponding label defining the group.

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();
        }
    }

Is there a good way to create a mailto link in the codebehind? I can't convert it to the aspx file because of the need for dynamic creation. Am I missing something here? Any help or advice is greatly appreciated. Thanks.

EDIT: The link needs to have the name displayed rather than the email address, requiring calling two columns from the datatable: [1] and [4].

Got it working, code is all below.

Where my gridview stuff is:

tfName.ItemTemplate = new NameColumn();

The class that was required for the TemplateField. It is a bit messy with the literal tags, but I am just happy for a solution that worked:

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";
        }
    }
}

解决方案

okay sorry you need to switch to a bound field vs. a hyperlinkfield for the mailto. Apparently there is a problem with the ":" in the DataNavigateUrlFormatString.

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

So all you really need to do is

        BoundField hlName = new BoundField();

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

That should resolve your problem.

这篇关于在代码隐藏中为动态生成的gridview创建一个mailto链接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆