2017-09-29 59 views
1

我想在GridView中改變第十個BoundField後面的CSS類,但我想通過DataField找到它(即使用字符串作爲索引)。如何在DataField中的GridView中查找BoundField?

protected void gdDeliveryDates_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     string DeliveryDue = DataBinder.Eval(e.Row.DataItem, "DeliveryDue").ToString(); 
     ((LinkButton) e.Row.FindControl("PostDelivery")).Enabled = !String.IsNullOrEmpty(DeliveryDue); 

     //e.Row.Cells[9].CssClass= "badge"; 
    } 
} 

在上面的代碼我已註釋了到目前爲止我發現的唯一的解決方案,這對我來說是不可接受的,因爲列數(即,如上文所指定的列9)是非常不穩定。我更願意通過DataField(字符串,在這種情況下,"MailCount",你會在網格聲明中進一步看到)中找到該列。下面是我的網格的樣子:

<asp:GridView ID="gdDeliveryDates" runat="server" AllowPaging="False" AllowSorting="True" DataSourceID="odsDeliveryDates" AutoGenerateColumns="False" CssClass="table table-striped table-bordered table-hover" OnRowCommand="gdDeliveryDates_RowCommand" OnSelectedIndexChanged="gdDeliveryDates_SelectedIndexChanged" DataKeyNames="PackageOfferedID, PackageID, PostageID, PackageNumber, PackageTitle, PostageName, Section, PostageStart, PostageEnd, DeliveryDue, LName, MailCount, Location" OnRowDataBound="gdDeliveryDates_RowDataBound" > 
    <Columns> 

     <asp:BoundField DataField="PackageID" HeaderText="PackageID" Visible="False" ReadOnly="True" SortExpression="PackageID" /> 
     <asp:BoundField DataField="PackageOfferedID" HeaderText="PackageOfferedID" Visible="False" ReadOnly="True" SortExpression="PackageOfferedID" /> 
     <asp:BoundField DataField="PostageID" HeaderText="PostageID" Visible="False" ReadOnly="True" SortExpression="PostageID" /> 

     <asp:BoundField DataField="PackageNumber" HeaderText="Package" Visible="True" ReadOnly="True" SortExpression="PackageNumber" HeaderStyle-CssClass="visible-xs visible-sm visible-md visible-lg" ItemStyle-CssClass="visible-xs visible-sm visible-md visible-lg" /> 

     <asp:BoundField DataField="PostageName" HeaderText="Postage" ReadOnly="True" SortExpression="PostageName" HeaderStyle-CssClass="visible-sm visible-md visible-lg" ItemStyle-CssClass="visible-sm visible-md visible-lg"/> 
     <asp:BoundField DataField="Section" HeaderText="Section" ReadOnly="True" SortExpression="Section" HeaderStyle-CssClass="visible-xs visible-sm visible-md visible-lg" ItemStyle-CssClass="visible-xs visible-sm visible-md visible-lg" /> 

     <asp:BoundField DataField="PostageStartDate" HeaderText="Start Date" ReadOnly="True" SortExpression="PostageStartDate" DataFormatString="{0:MM/dd/yyyy}" HeaderStyle-CssClass="visible-md visible-lg" ItemStyle-CssClass="visible-md visible-lg" /> 
     <asp:BoundField DataField="PostageEndDate" HeaderText="End Date" ReadOnly="True" SortExpression="PostageEndDate" DataFormatString="{0:MM/dd/yyyy}" HeaderStyle-CssClass="visible-md visible-lg" ItemStyle-CssClass="visible-md visible-lg" /> 
     <asp:BoundField DataField="DeliveryDueDate" HeaderText="Delivery Due" ReadOnly="True" SortExpression="DeliveryDueDate" DataFormatString="{0:MM/dd/yyyy}" HeaderStyle-CssClass="visible-xs visible-sm visible-md visible-lg" ItemStyle-CssClass="visible-xs visible-sm visible-md visible-lg" /> 

     <asp:BoundField DataField="MailCount" HeaderText="#" Visible="True" ReadOnly="True" SortExpression="MailCount" HeaderStyle-CssClass="visible-lg" ItemStyle-CssClass="visible-lg" /> 
     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:LinkButton ID="PostDelivery" runat="server" CausesValidation="false" CommandName="Add" 
          Text="Post Delivery" CommandArgument='<%# DataBinder.Eval(Container, "RowIndex") %>' 
          CssClass="buttonLayout" /> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:BoundField DataField="LName" HeaderText="LName" Visible="False" ReadOnly="True" SortExpression="LName" /> 

     <asp:BoundField DataField="Location" HeaderText="Location" Visible="False" ReadOnly="True" SortExpression="Location" /> 
    </Columns> 
</asp:GridView> 

回答

1

這是不可能的,但你可以試試這個方法:

public int FindIndexByDataField(this GridView gv, string datafieldname) 
{ 
    int index = -1, cnum = 0; 
    foreach (DataControlField col in gv.Columns) 
    { 
     if (col is BoundField) 
     { 
      BoundField coll = (BoundField)gv.Columns[cnum]; 
      if (coll.DataField == datafieldname) 
      { 
       index = cnum; 
       break; 
      } 
     } 
     cnum++; 
    } 
    return index; 
} 

並調用上面的方法是這樣的:

e.Row.Cells[FindIndexByDataField("MailCount")].CssClass= "badge"; 
+0

這是偉大的!我做了如下的修改,主要是因爲數據字段列名是什麼,我更願意參考的,而不是在GridView中使用的標題標題: 公共靜態INT GetIndexByName(GridView的GV,串dataFieldName) { \t INT index = -1,cnum = 0; \t的foreach(在gv.Columns的DataControlField COL) \t { \t \t如果(COL是綁定列) \t \t { \t \t \t的BoundField COLL =(綁定列)gv.Columns [CNUM]; \t \t \t如果(coll.DataField == dataFieldName) \t \t \t { \t \t \t \t指數= CNUM; \t \t \t \t break; \t \t \t} \t \t} \t \t CNUM ++; \t} \t return index; } – ShieldOfSalvation

+0

我已更新DataField,順便說一句,使用DataField,HeaderText或SortExpression :) – AsifAli72090

相關問題