1. 程式人生 > >解決無法獲取 GridView 隱藏列值問題

解決無法獲取 GridView 隱藏列值問題

在 GridView/DetailsView 中如果 BoundField 的 Visible=false 時,  回發的時候無法此列的值(GridViewRow.Cells[cellIndex].Text將為空),網上很多朋友提出了各種各樣的解決方案,這裡整理一下,並提供示例。

未反射 GridView 類,不曾仔細閱讀其原始碼,不知內部實現對於 BoundField(普通繫結列),當此列 Visible=false 時,是未執行繫結計算,還是未保持 ViewState,也許這是就是傳說的GridView效能由於DataGrid的一點吧。事實上,這樣反而給粗心的開發者帶來了“莫名其妙”的問題。DataGrid 中 BoundColumn 不存在此問題。

MSDN 對此是這樣的說明:

備註
使用 Visible 屬性顯示或隱藏資料繫結控制元件中的 DataControlField 物件。
如果 Visible 屬性為 false,則不顯示資料值並且不做到客戶端的往返行程。如果要往返不可見欄位的資料,請將欄位名新增到資料繫結控制元件的 DataKeyNames 屬性。

說明:BoundField 類繼承自 DataControlField 類。

事實上,實際專案中,我幾乎沒有使用隱藏列的經驗,即使在 1.x 的 DataGrid 中,為了記錄某些有用的隱藏資訊,我一般使用模板列中巢狀控制元件,如label 並設定其visible=false 最佳當然是用 input type=hidden runat=server(注:1.x 中沒有 asp:hiddenfield 控制元件)。
而 2.0 ,最佳的方案,當然是使用 DataKeys 來儲存,不像DataGrid.DataKey ,GridView/DetailsView.DataKeys 可以儲存多個值。

以下為示例程式碼,程式碼包含各種方案的“自說明”註釋,不再做過多的解釋

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>

<%--http://community.csdn.net/Expert/TopicView3.asp?id=5646507--%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) {
            LoadProductData();
        }
    }  

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        // 客戶端 CSS 控制隱藏,不安全,畢竟資料還是呈現到客戶端了
        e.Row.Cells[3].Style.Add(HtmlTextWriterStyle.Display, "none");
        // 設定單元格隱藏, TableCell.Visible=false, OK
        e.Row.Cells[4].Visible = false;
    }
    
    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {        
        int rowIndex = -1;        
        switch (e.CommandName) {
            case "Select":
                rowIndex = Convert.ToInt32(e.CommandArgument);
                GridViewRow row = GridView1.Rows[rowIndex];
                Response.Write(String.Format("<pre style='color:red'>您選擇了第 {0} 行\n當前行 ProductId={1}, CategoryId={2}(兩者均由DataKeys獲取)\n", 
                    (row.RowIndex + 1),
                    GridView1.DataKeys[rowIndex].Values["ProductId"],
                    GridView1.DataKeys[rowIndex].Values["CategoryId"]));                
                for (int columnIndex=0; columnIndex< GridView1.Columns.Count; columnIndex++) {
                    DataControlField field = GridView1.Columns[columnIndex];
                    string text = null;
                    if (field is BoundField) {
                        text = row.Cells[columnIndex].Text;
                    }
                    else if (field is TemplateField) {
                        Label lbl = row.Cells[columnIndex].FindControl("lblProductID") as Label;
                        if (lbl != null) {
                            text = lbl.Text;
                        }
                        else {
                            text = row.Cells[columnIndex].Text;
                        }
                    }
                    Response.Write(String.Format("{0}#Type={1}#Visible={2}#CanGetText={3}#Text={4}\n", 
                        field.HeaderText, field.GetType().Name.ToString(), field.Visible, !String.IsNullOrEmpty(text), text));
                }
                Response.Write("</pre>");
                break;
        }
    }
    
    void LoadProductData()
    {
        DataTable dt = CreateProductTable();

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

    #region sample data

    static DataTable CreateProductTable()
    {
        DataTable tbl = new DataTable("Products");

        tbl.Columns.Add("ProductID", typeof(int));
        tbl.Columns.Add("ProductName", typeof(string));
        tbl.Columns.Add("CategoryID", typeof(int));
        DataRow row = tbl.NewRow();
        row[0] = 1;
        row[1] = "Chai";
        row[2] = 1;
        tbl.Rows.Add(row);

        row = tbl.NewRow();
        row[0] = 2;
        row[1] = "Chang";
        row[2] = 1;
        tbl.Rows.Add(row);

        row = tbl.NewRow();
        row[0] = 3;
        row[1] = "Aniseed Syrup";
        row[2] = 2;
        tbl.Rows.Add(row);

        row = tbl.NewRow();
        row[0] = 4;
        row[1] = "Chef Anton's Cajun Seasoning";
        row[2] = 2;
        tbl.Rows.Add(row);

        row = tbl.NewRow();
        row[0] = 5;
        row[1] = "Chef Anton's Gumbo Mix";
        row[2] = 2;
        tbl.Rows.Add(row);

        row = tbl.NewRow();
        row[0] = 47;
        row[1] = "Zaanse koeken";
        row[2] = 3;
        tbl.Rows.Add(row);

        row = tbl.NewRow();
        row[0] = 48;
        row[1] = "Chocolade";
        row[2] = 3;
        tbl.Rows.Add(row);

        row = tbl.NewRow();
        row[0] = 49;
        row[1] = "Maxilaku";
        row[2] = 3;
        tbl.Rows.Add(row);

        return tbl;
    }

    #endregion  
    
    protected void Button1_Click(object sender, EventArgs e)
    {
        LoadProductData();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Demo6_AccessHiddenGridViewColumnValue</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" DataKeyNames="ProductId,CategoryId" runat="server" AutoGenerateColumns="False" OnRowCommand="GridView1_RowCommand" OnRowDataBound="GridView1_RowDataBound"  CellPadding="4" ForeColor="#333333">
            <Columns>
                <asp:BoundField DataField="ProductID" HeaderText="列0 正常狀態"/>
                <asp:BoundField DataField="ProductID" HeaderText="列1 直接設定Visible=false 無法獲取值" Visible="False" />
                <asp:BoundField DataField="ProductID" HeaderText="列2 width=0 客戶端依然呈現無效">
                    <ItemStyle Width="0px" />
                </asp:BoundField>        
                <asp:BoundField DataField="ProductID" HeaderText="列3 客戶端 CSS 控制隱藏,不安全,畢竟資料還是呈現到客戶端了"/>
                <asp:BoundField DataField="ProductID" HeaderText="列4 設定單元格隱藏, TableCell.Visible=false, OK"/>                
                <asp:TemplateField HeaderText="列5 模板列直接呼叫 Eval " Visible="False">
                    <ItemTemplate>
                        <%# Eval("ProductID") %>
                    </ItemTemplate>
                </asp:TemplateField>                
                <asp:TemplateField HeaderText="列6 模板列嵌入 Label" Visible="False">
                    <ItemTemplate>
                        <asp:label ID="lblProductID" runat="server" Text='<%# Eval("ProductID") %>' />
                    </ItemTemplate>
                </asp:TemplateField> 
                <asp:BoundField DataField="ProductName" HeaderText="列7"/>  
                <asp:ButtonField CommandName="Select" Text="Select" HeaderText="列8 按鈕" />
            </Columns>
            <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
            <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
            <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
            <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <AlternatingRowStyle BackColor="White" />
        </asp:GridView></div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="重新繫結資料" />
    </form>
</body>
</html>
原始碼免費下載地址:http://blog.csdn.net/wksnm0724/article/details/6857745

相關推薦

解決無法獲取 GridView 隱藏問題

在 GridView/DetailsView 中如果 BoundField 的 Visible=false 時,  回發的時候無法此列的值(GridViewRow.Cells[cellIndex].Text將為空),網上很多朋友提出了各種各樣的解決方案,這裡整理一下,並提供

GridView獲取隱藏的詳細總結

這個問題是比較常見的,網上也有不少類似文章,最近做專案也遇到這個問題,這裡在自己分析基礎上,結合實際問題,總結這一問題的幾種解決方案。 問題提出:在使用GridView控制元件時候,往往需要對某一列進行隱藏,而在後臺程式碼中,有時卻又需要這個隱藏列的值來進行一些別的操作,比如我就遇到一個實際問題:控制元件G

codeSmith7解決無法獲取到MySQL中的表和的comment屬性

最近學習codeSmith7,發現開發效率瞬間提高了不少。但是連線mysql資料庫開發時,遇到無法獲取到MySQL中的表和列的comment屬性。記錄一下解決的方案,方便後人出坑。 一、測試結果: 建表語句 CREATE TABLE test (   id big

echarts 無法獲取屬性“getAttribute”的: 物件為 null 或未定義 錯誤解決方法

  使用百度的echarts時,在IE9下執行時有時會報如題的錯誤,有時重新整理下又正常,造成這種錯誤的原因是 echarts.js引用放在head中或者放在body中HTML程式碼的前面了,造成載入時阻塞後面的html。 解決方法就是將echarts.js的引用放在<

C#如何獲取gridview模板

模板列有兩種取值方式. 1:GridView1.Rows[index].Cells[2].Text  這是取的模板列單元格的值.和普通的列取值是一樣的. 2:((Label)(GridView.Rows[index].Cells[2].FindControl("Contr

SCRIPT5007:無法獲取屬性“show”的,對象為null或沒有定義

dojo show post nbsp gb2 data scrip con style 1、錯誤描寫敘述 SCRIPT5007:無法獲取屬性“show”的值,對象為null或沒有定義 dojo.js,行15.字符11808 2、錯誤原因

C# 後臺獲取GridView列表的

text ring 行數 獲取 後臺 nbsp tex containe 文本 int rowIndex = ((GridViewRow)((Button)sender).NamingContainer).RowIndex;//獲取gridview中

在js中無法獲取多個id為demo的問題

例如程式碼中: <script> $(document).ready(function(){ $("#demo").hover(function(){ $("h1").css("background-color","yellow"); },function(){

獲取表格中時,空格符也會加進去,導致判斷陣列中是否包含時會返回false

//初始化已選優惠券編碼 var discountTbody=document.getElementById('discountTbody'); var discountRows=discountTbody.rows; var selectCouponList=[]; console.l

獲取表格中時,空格符也會加進去,導致判斷陣列中是否獲取會返回false

//初始化已選優惠券編碼 var discountTbody=document.getElementById('discountTbody'); var discountRows=discountTbody.rows; var selectCouponList=[]; con

無法獲取頁面HiddenField的

當在頁面上設定隱藏控制元件: asp:HiddenField ID="HiddenIP" runat="server" 在JS中通過$('#XXX').val()獲取值有時候會失敗, 因為JS執行時,asp控制元件的ID會改變,會在其ID命名前加上字首, 所以不能這樣直接通過

GridView隱藏的方法

在Asp.net 2.0中增加了一個新的資料繫結控制元件:GridView,其目的用來取代Asp.net1.x中的DataGrid控制元件。獲取GridView中的某列值的方法為   protected void GridView1_RowEditing(object sender, GridViewEdit

C#中GridView隱藏的方法

一開始解決這個問題的時候,查了google,發現都不是我想要的,在 GridViewColumn中,它有個屬性Width,如果設定為0,就沒有顯示出來,其實這個是虛假的,你可以把它再介面上拉長,因此不是我想要的。 後來在網上查到說是用GridView.Columns[

gridview隱藏的幾種方法

如果要對gridview的某個列根據條件隱藏或者隱藏不必要的列 一、簡單方法: GridViewBrand為gridview控制元件,要對第3列進行現在,就可以在gridview資料繫結完成之後這樣寫:   if (...)            {             

獲取GridView中的某

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

datatables隱藏設定及獲取隱藏

"columns": [                   { "data": "name" },                

如何取得GridView隱藏

問題: 在GridView中,在使用者點選按鈕的事件中可以使用下面的方法取當前行中某一列的值(從幫助裡copy出來的程式碼) int index = Convert.ToInt32(e.CommandArgument);// Retrieve the row that con

[vue.js]解決子元件無法獲取父元件store中的的問題

子元件: props:['myDetail'] 父元件: <子元件 :myDetail="detail"></子元件> computed:{ detail

頁面載入時通過獲取GridView某行某來控制某一的控制元件屬性

通過獲取狀態來控制“檢視”按鈕的Visible屬性值。           在前臺GridView中新增 OnRowDataBound="GridView1_RowDataBound“,如下: <asp:GridView ID="GridView1" runat="

datatable隱藏設定及獲取隱藏

原文:原文連結設定隱藏列:"columns": [ { "data": "name" }, { "data": "password" }, { defaultContent: '<td