C# 如何创建新的gridview列类型

C# 如何创建新的gridview列类型,c#,asp.net,.net,custom-controls,C#,Asp.net,.net,Custom Controls,我正在为我的ASP.NET应用程序创建一个自定义gridview控件,我希望它创建一个新的自定义列类型,以便执行以下操作: 这就是现在创建列的方式 <asp:TemplateField> <HeaderTemplate> <asp:LinkButton Text="R. Name" ToolTip="Resource Name" CommandName="Sort" CommandArgument="ResourceName" runat="

我正在为我的ASP.NET应用程序创建一个自定义gridview控件,我希望它创建一个新的自定义列类型,以便执行以下操作:

这就是现在创建列的方式

<asp:TemplateField>
<HeaderTemplate>
    <asp:LinkButton Text="R. Name" ToolTip="Resource Name" CommandName="Sort" CommandArgument="ResourceName"
        runat="server" />
    <uc:GridViewFilter ID="ucGridViewFilterResourceName" ColumnName="ResourceName" AssociatedControlType="TextBoxString"
        OnFilterApplied="ucGridViewFilter_FilterApplied" runat="server" />
</HeaderTemplate>
<ItemTemplate>
    <%# Eval("ResourceName") %>
</ItemTemplate>
我想要这样的东西:

<asp:GridViewExColumn HeaderTitle="R. Name" HeaderToolTip="Resource Name" ColumnName="ResourceName" SearchType="TextBoxString" OnFilterApplied="ucGridViewFilter_FilterApplied" Text='<%# Eval("ResourceName") %>' />
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using VMPortal.Tools;

public class GridViewExColumn : DataControlField
{
    public string HeaderToolTip { get; set; }
    public string GridViewID { get; set; }
    public string SearchType { get; set; }
    public string DataField
    {
        get
        {
            object value = ViewState["DataField"];

            if (value != null)
                return value.ToString();

            return string.Empty;
        }

        set
        {
            ViewState["DataField"] = value;
            OnFieldChanged();
        }
    }

    protected override DataControlField CreateField()
    {
        return new BoundField();
    }

    public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
    {
        base.InitializeCell(cell, cellType, rowState, rowIndex);

        if (cellType == DataControlCellType.Header)
        {
            var lb = new LinkButton
            {
                Text = HeaderText,
                ToolTip = String.IsNullOrWhiteSpace(HeaderToolTip) ? HeaderText : HeaderToolTip,
                CommandName = "Sort",
                CommandArgument = DataField
            };

            var tt = cell.Controls;
            cell.Controls.Add(lb);

            if (!String.IsNullOrWhiteSpace(SearchType))
            {
                // Add filter control
                var ctrlFilter = Control.Page.LoadControl("~/Controls/GridViewFilter.ascx") as GridViewFilter;
                cell.Controls.Add(ctrlFilter);
                ctrlFilter.ID = GridViewID + DataField;
                ctrlFilter.ColumnName = DataField;
                ctrlFilter.AssociatedControlType = SearchType;
                ctrlFilter.FilterApplied += ctrlFilter_FilterApplied;
            }
        }
        else if (cellType == DataControlCellType.DataCell)
            cell.DataBinding += new EventHandler(cell_DataBinding);
    }

    protected void cell_DataBinding(object sender, EventArgs e)
    {
        var cell = (TableCell)sender;
        var dataItem = DataBinder.GetDataItem(cell.NamingContainer);
        var dataValue = DataBinder.GetPropertyValue(dataItem, DataField);
        string value = dataValue != null ? dataValue.ToString() : "";
        cell.Text = value;
    }

    protected void ctrlFilter_FilterApplied(object sender, EventArgs e)
    {
        var filterExpression = sender as FilterExpression;
        if (filterExpression != null)
        {
            if (FilterApplied != null)
                FilterApplied(null, EventArgs.Empty);
        }
    }

有人能在隧道的尽头看到一些光吗?我完全迷路了,我可以成功地创建自定义gridview,但不知道从何处开始使用此自定义列类型。谢谢

我终于找到了做我想要的事情的方法,我会为你提供我的资金,也许你甚至可以做得更好

我创建了一个新的.cs扩展控件DataControlField,如下所示:

<asp:GridViewExColumn HeaderTitle="R. Name" HeaderToolTip="Resource Name" ColumnName="ResourceName" SearchType="TextBoxString" OnFilterApplied="ucGridViewFilter_FilterApplied" Text='<%# Eval("ResourceName") %>' />
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Web.UI;
using System.Web.UI.WebControls;
using VMPortal.Tools;

public class GridViewExColumn : DataControlField
{
    public string HeaderToolTip { get; set; }
    public string GridViewID { get; set; }
    public string SearchType { get; set; }
    public string DataField
    {
        get
        {
            object value = ViewState["DataField"];

            if (value != null)
                return value.ToString();

            return string.Empty;
        }

        set
        {
            ViewState["DataField"] = value;
            OnFieldChanged();
        }
    }

    protected override DataControlField CreateField()
    {
        return new BoundField();
    }

    public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
    {
        base.InitializeCell(cell, cellType, rowState, rowIndex);

        if (cellType == DataControlCellType.Header)
        {
            var lb = new LinkButton
            {
                Text = HeaderText,
                ToolTip = String.IsNullOrWhiteSpace(HeaderToolTip) ? HeaderText : HeaderToolTip,
                CommandName = "Sort",
                CommandArgument = DataField
            };

            var tt = cell.Controls;
            cell.Controls.Add(lb);

            if (!String.IsNullOrWhiteSpace(SearchType))
            {
                // Add filter control
                var ctrlFilter = Control.Page.LoadControl("~/Controls/GridViewFilter.ascx") as GridViewFilter;
                cell.Controls.Add(ctrlFilter);
                ctrlFilter.ID = GridViewID + DataField;
                ctrlFilter.ColumnName = DataField;
                ctrlFilter.AssociatedControlType = SearchType;
                ctrlFilter.FilterApplied += ctrlFilter_FilterApplied;
            }
        }
        else if (cellType == DataControlCellType.DataCell)
            cell.DataBinding += new EventHandler(cell_DataBinding);
    }

    protected void cell_DataBinding(object sender, EventArgs e)
    {
        var cell = (TableCell)sender;
        var dataItem = DataBinder.GetDataItem(cell.NamingContainer);
        var dataValue = DataBinder.GetPropertyValue(dataItem, DataField);
        string value = dataValue != null ? dataValue.ToString() : "";
        cell.Text = value;
    }

    protected void ctrlFilter_FilterApplied(object sender, EventArgs e)
    {
        var filterExpression = sender as FilterExpression;
        if (filterExpression != null)
        {
            if (FilterApplied != null)
                FilterApplied(null, EventArgs.Empty);
        }
    }
现在我可以添加一个新列,如下所示

    <uc:GridViewExColumn HeaderText="R. Name" HeaderToolTip="Resource Name" DataField="ResourceName" SearchType="TextBoxString" GridViewID="ucGridViewEx" OnFilterApplied="ucGridViewFilter_FilterApplied" />
希望它能帮助别人