1

在下面的网格视图中,我不想显示“ID”,但我需要按它进行过滤。我怎么做?您会看到我正在尝试使用“IF”进行过滤,但这不起作用e.Row.Cells("ID").Text = "21"

Imports System.Data

Partial Class Default2
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim table2 As New DataTable
    ' Create four typed columns in the DataTable.
    table2.Columns.Add("ID", GetType(Integer))
    table2.Columns.Add("Drug", GetType(String))
    table2.Columns.Add("Patient", GetType(String))
    table2.Columns.Add("Date", GetType(DateTime))
    ' Add five rows with those columns filled in the DataTable.
    table2.Rows.Add(25, "Indocin", "David", DateTime.Now)
    table2.Rows.Add(50, "Enebrel", "Sam", DateTime.Now)
    table2.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now)
    table2.Rows.Add(21, "Combivent", "Janet", DateTime.Now)
    table2.Rows.Add(1100, "Dilantin", "Melanie", DateTime.Now)
    table2.Rows.Add(125, "Indocin", "David", DateTime.Now)
    table2.Rows.Add(150, "Enebrel", "Sam", DateTime.Now)
    table2.Rows.Add(110, "Hydralazine", "Christoff", DateTime.Now)

    GridView1.DataSource = table2


    Dim s_Patient As BoundField = New BoundField
    s_Patient.DataField = "Patient"
    s_Patient.HeaderText = "Patient"

    Dim s_Drug As BoundField = New BoundField
    s_Drug.DataField = "Drug"
    s_Drug.HeaderText = "Drug"

    GridView1.Columns.Clear()
    GridView1.Columns.Add(s_Patient)
    GridView1.Columns.Add(s_Drug)


    GridView1.AutoGenerateColumns = False

    GridView1.DataBind()

End Sub

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow AndAlso (e.Row.Cells("ID").Text = "21" OrElse e.Row.Cells("ID").Text = "150") Then

        e.Row.BackColor = Drawing.Color.Blue

    End If

End Sub

结束类

4

2 回答 2

1

这段代码对我有用......

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ' only bind gridViewData once!
    If Not Page.IsPostBack Then
        ' INIT your table

        Dim s_Patient As BoundField = New BoundField
        s_Patient.DataField = "Patient"
        s_Patient.HeaderText = "Patient"
        Dim s_Drug As BoundField = New BoundField
        s_Drug.DataField = "Drug"
        s_Drug.HeaderText = "Drug"

        ' only for option 2
        GridView1.DataKeyNames = New String() {"ID"}

        GridView1.Columns.Add(s_Patient)
        GridView1.Columns.Add(s_Drug)
        GridView1.AutoGenerateColumns = False

        GridView1.DataSource = table2
        GridView1.DataBind()
    End If
End Sub

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        ' option one: check the underlying dataRowView
        Dim row As DataRowView = CType(e.Row.DataItem, DataRowView)
        If row("ID") = "21" OrElse row("ID") = "150" Then
            e.Row.BackColor = Drawing.Color.Blue
        End If

        ' option two: check according to the current DataItemdIndex 
        '             (ie what's the dataKey, in this case ID, of the fifth element)
        Dim id As String = GridView1.DataKeys(e.Row.DataItemIndex).Value
        If id = "21" OrElse id = "150" Then
            e.Row.BackColor = Drawing.Color.Brown
        End If
    End If
End Sub

此外,我建议查看WebForms(和dataBoundControls)中的 dataBinding 。例如,您可以在标记中设置 boundFields

于 2012-09-07T19:55:35.010 回答
1

可以显式设置 DataGridView 的任何 Column 的可见性。设置网格的数据源属性后,您可以访问列:

Dim gridViewColumn as datagridviewcolumn = GridView1.Columns("ID")
gridViewColumn.Visible = False

对于过滤器,您可能需要重新定义绑定设置:

对于 datagridview,您现在使用表作为数据源。(事实上​​,您正在使用(在“屏幕”后面)表上的 DEFAULT 数据视图。)

更灵活和清晰的是使用:

a) 显式绑定源,以及

b) 显式数据视图,

在de view中,您可以根据需要设置过滤器(并在运行时更改它),就像这样(假设您已经填充了表格):

dim mySort As Sting = ""
dim mySort As Sting = ""
dim mySort As Sting = ""
dim myFilter as String = "ID>23"
dim myDataView as new DataView(table2, myFilter, mySort, DataViewRowState.Currentrows)
dim myBindingSource as new BindingSource
myBindingSource.DataSource = myDataView
DataGridView1.DataSource = myBindingSource

然后再一次:

DataGridview1.Columns("ID").Visible = False

运行时您可以修改 DataView 的过滤器(和/或排序)属性。这将由 bindingsource 反映到网格显示的内容。

myDataView.Filter = "ID>24 AND ID<27"

顺便说一句:您可以将数据视图直接设置为网格的数据源。

于 2012-09-07T20:32:23.270 回答