11

我知道我要问的问题已经被其他人问过了,但这些答案并不能解决我的问题。

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

我还有一个数据表,里面装满了数据库中的数据。

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

在我的代码隐藏中,我添加了列并将数据源绑定到我的数据表。

但是当我尝试从隐藏的边界域中读取数据时,该域是空的。我不能使用类似问题中提到的解决方案的问题是,人们假设数据是一一填写的,而不是通过将数据表绑定到gridview的数据源。

所以我的问题是:他们是一种从隐藏的boundfield获取数据的方法,并且还保留通过将数据表绑定到gridview的数据源来添加数据的可能性?如果是这样,是否可以从该字段中获取值?

ps 我在 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)获取数据,因为他们可以编辑除了隐藏的boundfield之外的gridview,所以这是知道它是哪个原始行的唯一方法。

4

4 回答 4

17

为需要获取的列添加数据键:

<asp:GridView ID="GridView1" runat="server" DataKeyNames="hidden" ...>

添加数据键后,您可以使用行索引访问其值:

var rowIndex = 0;
var hiddenValue = (string)GridView1.DataKeys[rowIndex]["hidden"];
于 2012-04-05T15:19:09.633 回答
2

另一种选择是保持 BoundField(或任何其他类型的列)在标记中可见(删除Visible=False),并使用 RowDataBound 事件隐藏列:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[COLUMN_USERID].Visible = false;
}
于 2017-06-27T01:32:44.600 回答
1

您可以使用此代码。我测试了它。

TextBox1.Text = GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();

于 2013-06-22T10:24:59.053 回答
0

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

Visible = false

有了这个:

ItemStyle-CssClass="c_hidden"

然后用“display:none”创建一个类。效果是一样的,但是你的应用程序可以看到值。

于 2021-06-04T16:40:34.007 回答