首页 > 解决方案 > 从 vb.net 中的网格视图中查找单元格值,前端 asp.net

问题描述

我现在被这个问题困扰了很长时间。我需要从 Double 格式的网格视图表中获取值。我使用 Asp.net 作为前端,使用 Vb.net 编写后端代码

 Dim tmpMax As Double
 tmpMax = CDbl(Me.Dgv_Result1.Rows(1).Cells(columnName).value)

我在这里得到

*Value is not a member of System.web.UI.webcontrols.TableCell*

好吧,可能我试过这个:

tmpMax = Me.Dgv_Result1.Rows(1).Cells(columnName).ToString

这样一旦我得到字符串中的值,我就可以将其转换为 Double。但是在这里我得到的是实际的列名,而不是该列名的值。

如果社区中的任何人都可以为我解决这个问题,那就太好了。

提前致谢 :)

标签: c#asp.netvb.netdatagridview

解决方案


这将取决于您如何制作网格。

如果您使用默认(自动生成列),或者您使用数据绑定字段,那么您可以使用单元格。但是,如果您有自定义模板字段,则必须使用查找控件。

仅供参考:单元格仅按列号 - 您不能使用列名!!!

这是一个简单的网格。我们将显示整数“ID”列两次。我会这样做,所以你可以看到如何通过两种方式获得价值。

因此,如何获取值将取决于您在网格中使用的字段模板类型。

快速总结:如果您使用单元格集合,那么您只能使用列号(抱歉,不允许列名 - 总觉得这令人失望!!!)。但是,您可以编写一个自定义函数,让您按名称获取单元格()。

但是,至少让我们弄清楚何时必须使用单元格,以及何时必须使用查找控件。

所以,这个网格有一个混合。

          <asp:GridView ID="GVHotels" runat="server" class="table" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="ID"   HeaderText="PK ID"  />
                <asp:BoundField DataField="FirstName"   HeaderText="FirstName"  />
                <asp:BoundField DataField="LastName"    HeaderText="LastName"   />
                <asp:BoundField DataField="City"        HeaderText="City"       />
                <asp:BoundField DataField="HotelName"   HeaderText="HotelName" HeaderStyle-Width="200"   />
                <asp:BoundField DataField="Description" HeaderText="Description" />

                <asp:TemplateField HeaderText="Active"  ItemStyle-HorizontalAlign="Center"  >
                    <ItemTemplate>
                        <asp:CheckBox ID="ckActive" runat="server" 
                            Checked='<%# Eval("Active") %>'  CssClass="bigcheck" />
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="ID AGAIN"   >
                    <ItemTemplate>
                        <asp:TextBox ID="txtID" runat="server" 
                            Text = '<%# Eval("ID") %>'  />
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField HeaderText="Show values"   >
                    <ItemTemplate>
                        <asp:Button ID="Button2" runat="server" Text="Row Click" OnClick="Button2_Click" />
                    </ItemTemplate>
                </asp:TemplateField>


            </Columns>
        </asp:GridView>

注意在这个例子中,我显示“ID”两次!!!

所以,我们填充这个网格的代码是这样的:

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

    If Not IsPostBack Then

        Dim strSQL As String = 
            "SELECT * FROM tblHotels ORDER BY HotelName"

        GVHotels.DataSource = MyRst(strSQL)
        GVHotels.DataBind()

    End If

End Sub

Public Function MyRst(strSQL As String) As DataTable

    Dim rstData As New DataTable
    Using MyCon As SqlConnection = New SqlConnection(My.Settings.TEST3)
        Using cmdSQL As New SqlCommand(strSQL, MyCon)
            cmdSQL.Connection.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        End Using
    End Using
    Return rstData

End Function

我们现在有了这个:

在此处输入图像描述

好的,对于我们的行点击事件,我们有这个:

Protected Sub Button2_Click(sender As Object, e As EventArgs)

    Dim btn As Button = sender
    Dim gRow As GridViewRow = btn.Parent.Parent

    ' get ID (non template - cells colleciton

    Dim intID As Integer
    intID = gRow.Cells(0).Text
    Debug.Print("ID from cells collection = " & intID)

    ' get id from template field (item template).

    Dim tBox As TextBox = gRow.FindControl("txtID")

    intID = tBox.Text
    Debug.Print("Id from text box on grid row = " & intID)


End Sub

输出:

ID from cells collection = 73
Id from text box on grid row = 73

因此对于自动生成的列或非模板化控件(数据字段)。

我们必须对列进行计数并使用一个数字来收集单元格(如上所述,您不能使用列名)。

对于模板化控件,则必须使用 findcontrol,并且不能使用单元格集合。

因此,快速查看您的 gridview 标记,并取决于您使用的是自动生成的字段还是数据绑定字段(然后您使用单元格,并且仅使用数字列号)。

如果您在网格中有实际的 asp.net 标准控件,那么您必须使用查找控件。并拉高价值。注意如何有一个复选框,所以我们必须定义一个控件 CheckBox,并使用 MyCheckBox.Checked 来获取复选框值。但同样,如果我们使用数据绑定字段,那么我们使用 cells() 集合。


推荐阅读