【问题标题】:How to get a value from a DataGrid如何从 DataGrid 中获取值
【发布时间】:2014-03-24 17:29:05
【问题描述】:

有人可以告诉我如何从数据网格中获取值吗?我几乎尝试了所有方法:

.aspx页面中的代码:

<asp:GridView ID="GridViewInbox" runat="server">
    <Columns>
        <asp:TemplateField>

            <HeaderTemplate>
            </HeaderTemplate>

            <ItemTemplate>
            </ItemTemplate>

        </asp:TemplateField>
    </Columns>
</asp:GridView>

在 aspx.vb 页面后面的代码中,我试图获取这样的字符串值:

For Each row As GridViewRow In GridViewInbox.Rows
    If row.RowType = DataControlRowType.DataRow Then

    ... ??? ... Dim someString As String = row.Cells(1).Text not working

    End If
Next

带有问号的部分我需要弄清楚其中的内容以确保我从数据网格中获取字符串。在调用 Cells 之前是否有额外的步骤,或者这就是我所需要的????我如何从数据网格中获取值????

更新:

当我尝试这样做时:

GridViewInbox.Rows(1).Cells(1).ToString() 

我明白了:

System.Web.UI.WebControls.DataControlFieldCell

当我尝试这样做时:

GridViewInbox.Rows(1).Cells(1).Text

我什么都没有。

这就是我绑定数据网格的方式:

GridViewInbox.DataSource = dataTable    <- this here is System.Data.DataTable
GridViewInbox.DataBind()

所有数据显示。我在这里谈论的代码就在 GridViewInbox.DataBind() 之后

更新:

.aspx 页面模板字段绑定

<asp:TemplateField SortExpression="From">
    <HeaderTemplate>
        <asp:LinkButton>From</asp:LinkButton>
    </HeaderTemplate>
<ItemTemplate>
    <asp:Label
              ID="btnOpenFrom"
              runat="server"
              CommandArgument='<%#DataBinder.Eval(Container.DataItem, "From")%>'>
    <%#DataBinder.Eval(Container.DataItem, "From")%>
</asp:Label>
</ItemTemplate>
<ItemStyle Width="20%" />
</asp:TemplateField>

这是我的完整代码,也许这会有所帮助:

Public Function GetDataTable () As DataTable
    Dim dataTable As New DataTable("Some Name")
    dataTable.Columns.Add("ItemOne", GetType(String))
    dataTable.Rows.Add(...)  <- add rows data here, it matches the amount of columns
    Return dataTable
End Function

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ...
    GridViewTest.DataSource = GetDataTable()
    GridViewInbox.DataBind()

    For Each row As GridViewRow In GridViewTest.Rows
        If row.RowType = DataControlRowType.DataRow Then
        ... <- trying to get at the value in a datagrid
        End If
    Next
    ... 
End Sub

【问题讨论】:

  • 您收到什么错误信息?您的 aspx 代码似乎不包含任何数据。比如绑定字段。这可能是执行 for 循环后您没有收到任何数据的原因。
  • @AdityaBokade 我在这里列出的内容太多了。一切正常我能够对网格进行排序并显示数据。一切正常!!!!我的意思是我能说得有多清楚!!!我的问题是从数据网格中获取值的正确方法是什么我需要一个基于我放在那里的代码假设一切正常。
  • 您的代码是我用 C# 编写的,并且运行良好。我拿了一个gridview、一个标签和一个按钮。在单击按钮时,我编写了与您的代码几乎相同的代码,并且可以正常工作。但我是用 C# 编写的。
  • 我用 UPDATE 部分更新了原始问题。
  • 向我们展示您的ItemTemplate 的一小部分。我想看看你在那里有什么类型的控件。并显示您正在执行此循环的方法。

标签: vb.net visual-studio visual-studio-2012 datagrid datatable


【解决方案1】:

GridView 的 Rows 属性是 GridViewRowCollection 的对象。因此,要一次检索一行,您需要使用 GridViewRow 对象。 这就是原因,如果你直接使用 GridViewInbox.Rows(1).Cells(1).ToString(),它不会给你结果。

试试这个代码。很抱歉发布 C# 代码,因为我是 C# 开发人员,但我相信您将能够转换。

 foreach (GridViewRow row in GridViewInbox.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                Label1.Text += row.Cells[0].Text + "|" + row.Cells[1].Text + "|" + row.Cells[2].Text;
                Label1.Text += "<br/>";
            }

    }

【讨论】:

  • 好的,这里有一个屏幕,如果你可以看一下。我正在进行实时调试,它会在代码执行时向我显示值,它始终为空白。总是。 snag.gy/N98U0.jpg
  • 您如何将数据绑定到您的gridview?你在使用数据绑定吗?如果是,请尝试在 Page_Load() 中调用 this.DataBind() 方法。我希望您尝试在 gridview 中检索显示的值,而不是尝试在其中手动输入值。如果您的 gridview 一开始是空白的,那么您不能期望显示任何值!
  • 这里是你出错的地方。数据源可以是工具箱“数据”部分中指定的任一数据源。比如SqlDataSource。首先正确设置数据源。然后你会看到正确的结果。如果你不明白我在这里的意思,我认为你需要走很长的路。
  • 试试这个:GridViewInbox.AutoGenerateColumns = true before GridViewInbox.DataBind()。
  • 我手动构建数据网格所有“它拥有的百万种方法”:) 一切正常。我可以对数据进行排序,我可以查看数据,我可以更新数据。我正在使用实体框架来构建网格。我认为我试图获取的数据包含在某些东西中,或者某些东西可能设置不正确。因为当我绑定它并让 .NET 做它的事情时它可以工作,但是当我尝试手动遍历数据查看它没有的值时。
【解决方案2】:

在你的每次尝试中:

dim x as String = ""
x = row.Cells.Item("ColumnName").Value

编辑: 您必须首先将网格视图绑定到数据表,例如:

GridViewInbox.DataSource = dataTable

那么你正在查看的单元格中应该有一个值。 **必须使用您要查找的行填充数据表。

【讨论】:

  • 我没有可用的 .Value。我有文本,我可以这样做 Text.ToString()
  • .Text 怎么样,什么都没有?
  • 所以实际上什么都没有,可能存在绑定问题。
【解决方案3】:

如果您的 ItemTemplate 中有控件,那么正确的方法是使用 FindControl。

不确定为什么要将标签命名为“btnOpenFrom”?但是使用控件的 id 来查找。

For Each row As GridViewRow In GridViewInbox.Rows
    If row.RowType = DataControlRowType.DataRow Then

        Dim mylabel As Label = row.FindControl("btnOpenFrom")
        Dim something as string = mylabel.Text

    End If
Next

【讨论】:

  • 如果我使用 row.FindControl("InboxId")
  • 不,我不是这个意思。您需要向我们展示您的一些ItemTemplate。而且,你在哪里做这个循环? ItemDataBound 事件?
  • 更新了我的答案。您使用控件的 ID 来查找它。不是列名。
  • 你还没有显示你的循环代码在哪里?它在 Page_Load 中吗?项目数据绑定?它在哪里?
猜你喜欢
  • 2012-12-09
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多