【问题标题】:Dynamically create item template hyperlink field in gridview ASP.NET在gridview ASP.NET中动态创建项目模板超链接字段
【发布时间】:2019-06-25 19:46:36
【问题描述】:

我正在尝试动态创建一个模板字段,其中包含一个由超链接字段组成的项目模板。尝试在后端 asp.net 代码中重新创建以下代码:

<asp:TemplateField HeaderText="Total" SortExpression="TotalCases" ItemStyle-HorizontalAlign ="Center" ControlStyle-ForeColor="Black">
                           <ItemTemplate>
                              <asp:HyperLink ID="TotalCases" Target="_blank" runat="server" Text='<%# Eval("TotalCases") %>' />
                           </ItemTemplate>
                        </asp:TemplateField>

我创建了一个名为 totalcases 的新模板字段,现在我正在尝试将项目模板作为超链接字段获取,这是我卡住的地方

TemplateField TotalCases = new TemplateField();
            TotalCases.HeaderText = "Total";
            TotalCases.SortExpression = "TotalCases";
            TotalCases.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
            TotalCases.ControlStyle.ForeColor = System.Drawing.Color.Black;
            TotalCases.ItemTemplate = new HyperLink(); //THIS DOESNT WORK
            clientgv.Columns.Add(TotalCases);

错误:无法将 System.Web.UI.WebControls.Hyperlink 类型转换为 System.Web.UI.Template。存在显式转换。

我正在尝试获取在 rowdatabound 方法中分配的超链接 URL,但它找不到超链接并且在调试时返回为 null

 HyperLink hltc = (HyperLink)e.Row.FindControl("TotalCases");

【问题讨论】:

  • 如何把超链接字段放到item模板里面?
  • 您为什么要这样做?隐藏现有列然后以编程方式添加一个列会容易得多。
  • 我需要动态完成它,因为它循环通过 sql 代码并根据输出中的行数生成 gridview。我不想要这个硬编码我希望它在后端代码中动态完成。这是我的要求。一旦我弄清楚如何在后端动态创建它,现有的列就会被删除
  • class HyperlinkColumn : ITemplate{ public void InstantiateIn(System.Web.UI.Control container) { HyperLink hypLink = new yperLink(); container.Controls.Add(link); }}试试这个链接stackoverflow.com/questions/13288215/…
  • 别以为我明白了。在示例中,他们添加了“链接”,什么是链接?它没有在任何地方定义

标签: c# asp.net


【解决方案1】:

看看下面的代码。

TemplateField customField = new TemplateField();
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, "FirstName", ControlType.HyperLink);
customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, "First Name", ControlType.Label);
gv.Columns.Add(customField);


 public class GridViewTemplate : ITemplate
    {
        private DataControlRowType templateType;
        private ControlType controlType;
        private string columnName;

        public GridViewTemplate(DataControlRowType type, string colname, ControlType contType)
        {
            templateType = type;
            columnName = colname;
            controlType = contType;
        }

        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (templateType)
            {
                case DataControlRowType.Header:
                    Literal lc = new Literal();
                    lc.Text = "<b>" + columnName + "</b>";
                    container.Controls.Add(lc);
                    break;
                case DataControlRowType.DataRow:
                    WebControl firstName = null;
                    switch (controlType)
                    {
                        case ControlType.Label:
                            firstName = new Label();
                            break;
                        case ControlType.HyperLink:
                            firstName = new HyperLink();
                            break;
                        default:
                            break;
                    }
                    firstName.DataBinding += new EventHandler(this.FirstName_DataBinding);
                    container.Controls.Add(firstName);
                    break;
            }
        }

        private void FirstName_DataBinding(Object sender, EventArgs e)
        {
            GridViewRow row = null;
            switch (controlType)
            {
                case ControlType.Label:
                    Label l = (Label)sender;
                    row = (GridViewRow)l.NamingContainer;
                    l.Text = DataBinder.Eval(row.DataItem, "FirstName").ToString();
                    break;
                case ControlType.HyperLink:
                    HyperLink l2 = (HyperLink)sender;
                    row = (GridViewRow)l2.NamingContainer;
                    l2.Text = DataBinder.Eval(row.DataItem, "FirstName").ToString();
                    l2.NavigateUrl = "https://www.google.com";
                    break;
            }
        }
    }
    public enum ControlType
    {
        Label = 1,
        HyperLink = 2
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多