2013-05-21 25 views
0

我有一個完全以編程方式綁定的gridview。我想隱藏一些專欄,並且讓他們豐富,讓他們在標籤中展示。如何隱藏列並在Gridview中以編程方式訪問它?

這裏是我的GridView:

<Gridview ID=Gridview1 runat="server" ></Gridview> 

我想隱藏的EmpID和單元ID。並希望向他們展示在標籤上的前端側

EmpID EmpName UnitID UnitName  
-------------------------------- 
1  jack  4  MyUnit 

我想使用此代碼,但它甚至沒有工作給我的錯誤

if (GridForUnits.Columns.Count > 1) 
     { 
      GridForUnits.Columns[1].Visible = false; 
      //GridForUnits.Columns[1].Visible = false; 
     } 

任何幫助感激

謝謝

回答

1

如果你想隱藏一個邏輯上的列基,你想使用RowDataBound

未來有點容易維護。

下面是示例。您可以隱藏或顯示您喜歡的任何列。

enter image description here

<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" 
    AutoGenerateColumns="False"> 
    <Columns> 
     <asp:BoundField HeaderText="EmpID" DataField="EmpID" /> 
     <asp:TemplateField HeaderText="EmpName" > 
      <ItemTemplate> 
       <asp:Label runat="server" ID="EmpNameLabel" 
        Text='<%# Eval("EmpName") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField HeaderText="UnitID" DataField="UnitID" /> 
     <asp:TemplateField HeaderText="UnitName" > 
      <ItemTemplate> 
       <asp:Label runat="server" ID="UnitNameLabel" 
        Text='<%# Eval("UnitName") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 


public class Employee 
{ 
    public int EmpID { get; set; } 
    public string EmpName { get; set; } 
    public int UnitID { get; set; } 
    public string UnitName { get; set; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    GridView1.DataSource = new List<Employee> 
    { 
    new Employee { EmpID = 1, EmpName = "One", UnitID = 100, UnitName = "One hundred"}, 
    new Employee { EmpID = 2, EmpName = "Two", UnitID = 200, UnitName = "Two hundred"}, 
    new Employee { EmpID = 3, EmpName = "Three", UnitID = 300, UnitName = "Three hundred"}, 
    new Employee { EmpID = 4, EmpName = "Four", UnitID = 400, UnitName = "Four hundred"} 
    }; 
    GridView1.DataBind(); 
} 


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     var employee = e.Row.DataItem as Employee; 
     var empNameLabel = e.Row.FindControl("EmpNameLabel") as Label; 
     var unitNameLabel = e.Row.FindControl("UnitNameLabel") as Label; 

     if (employee.UnitID == 200) 
     { 
      empNameLabel.Visible = false; 
      unitNameLabel.Visible = false; 
     } 
    } 
} 
0

我會認爲你是綁定到數據表。您需要

  1. 定製您的GridView以僅顯示希望可見的列。
  2. 在GridView屬性窗口中將AutoGenerateColumn設置爲false。
  3. 訪問DataTable中的EmpID和UnitID信息,而不是從GridView綁定。

希望這有助於

0

是居然還有一個簡單的方法來做到這一點。

你可能會收到一個錯誤,因爲當你autogenerate列數始終爲0

Databind後,遍歷欄位,並通過索引隱藏起來。對於這個例子,我也會假設你的數據源是DataTable

 DataTable dt = new DataTable(); 
     dt.Columns.Add("EmpID"); 
     dt.Columns.Add("EmpName"); 
     dt.Columns.Add("UnitID"); 
     dt.Columns.Add("UnitName"); 
     DataRow dr = dt.NewRow(); 
     dr["EmpID"] = 1; 
     dr["EmpName"] = "Jack"; 
     dr["UnitID"] = 4; 
     dr["UnitName"] = "MyUnit"; 
     dt.Rows.Add(dr); 

     GridView1.DataSource = dt; 
     GridView1.DataBind(); 

     //GridView1.Columns[0].Visible = false; // will error on autogenerate columns 
     // So after your data is bound, loop though 

     int columnIndexEmpID = 0; 
     int columnIndexUnitID = 2; 

     GridView1.HeaderRow.Cells[columnIndexEmpID].Visible = false; 
     GridView1.HeaderRow.Cells[columnIndexUnitID].Visible = false; 
     foreach (GridViewRow gvr in GridView1.Rows) 
     { 
      gvr.Cells[columnIndexEmpID].Visible = false; 
      gvr.Cells[columnIndexUnitID].Visible = false; 
     } 

您需要將RowDataBound事件附加到您的網格視圖。

<asp:GridView ID="GridView1" runat="server" 
    onrowdatabound="GridView1_RowDataBound"> 
</asp:GridView> 

在這裏,您可以訪問您的隱藏值。

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    DataRowView drv = (DataRowView)e.Row.DataItem; 
    if (drv != null) 
    { 
     string cellValue = Convert.ToString(drv["EmpID"]);// By column name 
    } 
} 

視爲豐富與標籤的數據網格,運已爲您提供了完美的解決方案:P

+0

您也可以隱藏在綁定事件像e.Row.Cells行數據細胞/頭細胞[1] .Visible = false; GridView1.HeaderRow.Cells [1]。Visible = false;我只是喜歡在綁定後調用它 – clamchoda

+0

謝謝。我用你和@Win的幫助解決了我的問題。我有一個關於gridview的小問題。我添加了新的命令字段到我的gridview選擇。它顯示在第一個列。我想把它傳遞給最新的專欄。那麼我該如何實現它。我可以使用Displayindex,但這個列沒有標題行。 – one1day

相關問題