从隐藏的 BoundField 获取值?ASP.NET

11

我知道我要问的问题已经被其他人问过了,但是那些答案对我的问题没有解决。

我的 gridview 包含 2 个 BoundFields、2 个 ButtonFields 和一个复选框字段(这是一个 TemplateField)。

我还有一个数据表,其中包含从数据库中获取的数据。

在 aspx 代码中,我使用字段创建我的 gridview 并将最后一个 BoundField 设置为 Visible = false

在我的代码后台中,我添加列并将数据源绑定到我的 datatable。

但是当我尝试读取隐藏的 boundfield 中的数据时,该字段为空。我不能使用类似问题中提到的解决方案的原因是这些人假设数据逐个填充,而不是通过将 datatable 绑定到 gridview 的数据源来填充。

所以我的问题是:有没有办法从隐藏的 boundfield 获取数据,并保留通过将 datatable 绑定到 gridview 的数据源添加数据的可能性?如果可以,是否可以获取该字段的值?

附言:我在 visual studio 2010 中使用 asp.net/c#。

ASPX:

<asp:GridView ID="gvSelect" runat="server" AutoGenerateColumns="False" BorderStyle="None" onrowcommand="gvTestSelect_RowCommand">
    <Columns>
        <asp:TemplateField>
            <HeaderTemplate>
                <asp:CheckBox runat="server" ID="cbHeader" OnPreRender="cbHeader_PreRender" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="cbItems" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="field" HeaderText="Veld" SortExpression="field" />
        <asp:ButtonField DataTextField="up" HeaderText="Omhoog" SortExpression="up" CommandName="up" Text="&uarr;" />
        <asp:ButtonField DataTextField="down" HeaderText="Omlaag" SortExpression="down" CommandName="down" Text="&darr;" />
        <asp:BoundField DataField="hidden" SortExpression="hidden" />
    </Columns>
</asp:GridView>

代码后端(我在其中填充gridview):

//create array list and fill it with all columns
Dictionary<string, string> dict = FillLists.getColumnsByTable(loader, ddlInfoTableI.SelectedItem.Value.ToString());

//loop trough dictionary
foreach (var val in dict)
{
    //create new dtSelect datarow
    DataRow dr = dtSelect.NewRow();

    //set row values for column values
    dr["select"] = false;
    dr["field"] = val.Value.ToString();
    dr["up"] = new ButtonField { CommandName = "up", Text = loader.LoadResourceString(1024), HeaderText = "&uarr;", ButtonType = ButtonType.Button, Visible = true };
    dr["down"] = new ButtonField { CommandName = "down", Text = loader.LoadResourceString(1025), HeaderText = "&darr;", ButtonType = ButtonType.Button, Visible = true };
    dr["hidden"] = val.Key.ToString();

    //add the datarow
    dtSelect.Rows.Add(dr);

    //set datatable session to datatable
    Session["dtSelect"] = dtSelect;

    //set datasource of the gridview to datatable
    gvSelect.DataSource = dtSelect;

    //bind data to gridview
    gvSelect.DataBind();
}

现在我需要从GridView获取数据(尤其是隐藏的BoundField),因为他们可以编辑GridView,除了隐藏的BoundField之外,所以这是唯一的方法来知道它是哪一行原始数据。


你是什么时候以及如何阅读的? - V4Vendetta
http://stackoverflow.com/faq#howtoask - huMpty duMpty
我按照你的要求添加了代码示例。 顺便说一句,我只想通过以下方式获取数据:string strHiddenFieldData = gvSelect.Rows[0].Cells[4].ToString();。但是正如我所说,这会返回一个空字符串 :-( - Wesley Lalieu
在客户端的HTML源代码中是否显示键值? - Joshua Drake
4个回答

17
为需要获取的列添加一个数据键:
<asp:GridView ID="GridView1" runat="server" DataKeyNames="hidden" ...>

一旦你添加了数据键,就可以通过行索引访问它的值:

var rowIndex = 0;
var hiddenValue = (string)GridView1.DataKeys[rowIndex]["hidden"];

2
另一种选择是在标记中保留BoundField(或任何其他类型的列)的可见性(删除Visible=False),并使用RowDataBound事件隐藏列:
protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[COLUMN_USERID].Visible = false;
}

1
所有的答案看起来都不错,但是如果你已经编写了代码并且不想进行其他更改,那么这种方法最好。 - U.Y.

1
你可以使用这段代码。我已经测试过了。 TextBox1.Text = GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();

这是我目前发现的最干净的方法。 - ArtK

0

这是一篇非常老的帖子,但对于任何仍然感兴趣的人来说,有一个更简单的方法。将此替换为:

Visible = false

使用这个:

ItemStyle-CssClass="c_hidden"

创建一个带有“display:none”的类。效果相同,但您的应用程序可以看到该值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接