【问题标题】:GridView - Hide Column but Use ValueGridView - 隐藏列但使用价值
【发布时间】:2013-07-18 23:41:52
【问题描述】:

我正在使用以编程方式填充的 GridView。为了访问 ID 值,我必须将其作为列之一(与 ListBox 不同,在 ListBox 中,我能够以隐藏的方式将值分配给每个条目)。有没有办法隐藏该 ID 列,但仍使用该值?

这些列是通过代码自动生成的,我正在使用 DataKeys 访问 ID 值。

【问题讨论】:

    标签: c# asp.net gridview


    【解决方案1】:

    以下是您可以执行的操作的一般概述。这并不复杂。您像往常一样进行数据绑定,但这样做时您会找到 ID 列的索引。然后使用该索引隐藏 RowCreated 事件上的列。如果您搜索如何使用自动生成的列隐藏列,您将按照我用于隐藏的方法遇到几个答案。

    Private IDColumnIndex As Integer      //Class scope - we need to use it in multiple methods
    
    Public Sub PageLoad() Handles Me.Load //or wherever your databind is happening
        Dim source As New DataTable()
        IDColumnIndex = source.Columns("id").Ordinal   //Gets column index of "ID" column
    
        view.DataSource = source
        view.DataBind()
    End Sub
    
    //Hide our "ID" auto-generated column.
    Public Sub view_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles view.RowCreated
        e.Row.Cells(IDColumnIndex).Visible = False
    End Sub
    

    【讨论】:

    • 对不起,我应该指定 C#。它不应该有太大的不同,所以无论如何我都会尝试使用它。谢谢!
    • 另外,我使用列表而不是 DataTable 填充 GridView。这似乎有所不同,因为 List 没有 Columns 数组。在将其分配给 DataSource 之后,我尝试从 GridView 访问它,但没有成功,因为我需要索引才能使用 Columns 数组。
    • 我明白了。我在 VB 中编写它只是为了在你标记它 C# 之前给你一个想法,并且不知道你的数据源类型我只是在说明你需要 ID 列的索引以供以后使用。如果您知道 ID 列的索引将始终为 5(例如),您可以将其硬编码到 RowCreated 处理程序中,这不是很好,但取决于您的场景可能对您有用。检索 ID 列索引当然取决于 List 中对象的类型。
    • ID 列将始终是输入的第一列。这是否意味着它将为0?我同意它不是那么好,但它似乎可以在这种情况下工作。作为一行输入的每个对象都是 MyObject 类型,它有 4 个属性(所有字符串),并且当 MyObjects 列表设置为 GridView 的数据源时,它的每个属性都输入到一列中。每列值都是一个字符串,但它被添加为一整行,代表一个 MyObject 类型的对象。
    • 我明白了。在这种情况下,是的,继续使用 0 作为索引,这应该对你有用。否则,以编程方式检索该索引可能会更困难一些(我必须查找如何说实话)。如果它不起作用,我想听听为什么。祝你好运!
    【解决方案2】:

    将 ID 分配给 DataKeyNames 集合可以正常工作,这对您来说是个问题吗?数据键可用于每一行,不会显示在 UI 中,但仍可通过行数据访问,因此您可以获得每行的 ID。您只需从 DataKeys 集合中获取它,而不是直接从行中获取。

    您可以添加代码来隐藏第一列(ID)以使其不出现,并依靠使用 datakeynames 来获取 ID 值...如果这不起作用,您能否详细说明原因所以我可以调整我的答案..

    【讨论】:

    • 我可以使用PanelGridView.SelectedDataKey["id"] 访问该ID,那么我现在如何隐藏该列?我应该补充一点,我添加到 DataKeys 中的只是 DataKeyNames,它似乎是从自动生成的列中获得的……有没有办法把它放在 DataKeys 中,而不仅仅是指定要从自动生成的列?
    • 如果它在 DataKeyNames 集合中,则不必有列;我一直都这样做。但如果你愿意,我认为你可以在标记中的列上说 Visible="false",所以它被隐藏了,或者使用 CSS style="display:none" 使用 item/header/alt item/footer 样式。跨度>
    • 如果您使用自动生成的列,您可以隐藏第一列,甚至可以通过Columns.Remove(0)删除该列
    【解决方案3】:

    如果您将 ID 列添加到 GridView 的 DataKeyNames 属性,您可以获得 ID 值。 msdn link here

    myGrid.DataKeys[myRow.RowIndex].Value.ToString();
    

    【讨论】:

    • 谢谢,我早些时候遇到过这个数组,但无论出于何种原因,我都没有想到将其称为 Value。我还能够使用 PanelGridView.SelectedDataKey["id"] 访问刚才的 ID。
    • 对不起,我忘了提到我确实将 ID 值添加到了 GridView 的 DataKeyNames 属性中。但是,如果我不将 ID 值添加到 GridView,它会声称“ID”没有值。
    【解决方案4】:

    我通常会添加一个可见的列但是然后将列的模板设置为一个空格或其他东西。然后在列的 ID 中,输入我要跟踪的 ID。当内容被呈现为 HTML 时,这种技术让我可以使用 javascript 轻松找到行的 ID。

    如果您让网格视图使用隐藏的数据键进行业务渲染,您可能永远无法在客户端浏览器的 JavaScript 中找到 ID。

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2012-06-02
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2014-08-24
      • 1970-01-01
      相关资源
      最近更新 更多