2013-01-21 36 views
1

我正在爲我的ASP.NET應用程序創建一個自定義gridview控件,並且我希望它創建一個新的自定義類型的列以執行以下操作之一:如何創建新的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") %>' /> 

任何人都可以在隧道的盡頭看到一些燈光?我完全失去了,我可以成功創建自定義的GridView,但不知道從哪個開始使用這種自定義列類型。謝謝

回答

0

我終於找到了做我正在尋找的方法,我會爲您提供我的創建者,甚至可以讓它變得更好。

我創建擴展控制的DataControlField這樣一個新的.cs:

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" /> 

希望它可以幫助別人。