9

我有一个带有数据库信息的 GridView。在我的 aspx 中,我有 2 个复选框。我需要根据 AccessType 值为每一行勾选一个复选框。如何在 foreach 中捕获 AccessType 值?

我的 aspx (GridView)

<asp:GridView ID="GridView" runat="server" AutoGenerateColumns="false" GridLines="None">
                <Columns>
                    <asp:BoundField DataField="AccessGroup" HeaderText="Access Group" />
                    <asp:BoundField DataField="FolderAccess" HeaderText="Folder Access" />
                    <asp:HyperLinkField DataNavigateUrlFields="group_manager" DataNavigateUrlFormatString="groupinfo.aspx?group={0}"
                        DataTextField="group_manager" HeaderText="Group Manager" />
                    <asp:BoundField DataField="AccessType" Visible="false" />
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:CheckBox ID="CheckBox1" runat="server" Text="Access to Read" />
                            <asp:CheckBox ID="CheckBox2" runat="server" Text="Access to Modify" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

我的.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        var listaProdutos = new RequestAccess().ConsultarProdutos();
        if (listaProdutos != null)
        {
            this.GridView.DataSource = listaProdutos;
            this.GridView.DataBind();

            foreach (GridViewRow row in GridView.Rows)
            {
                CheckBox check = (CheckBox)row.FindControl("CheckBox1");
                CheckBox check2 = (CheckBox)row.FindControl("CheckBox2");


                //EX!!!
                //IF AccessType = 1
                //{
                //    check.Checked = true;
                //}

                //IF AccessType = 2
                //{
                //    check2.Checked = true;
                //}
            }
        }
    }
}
4

2 回答 2

18

您可以BoundFields通过以下方式访问e.Row.Cells[index].Text

foreach (GridViewRow row in GridView.Rows)
{
    string accessType = row.Cells[3].Text;
}

但是,我会使用RowDataBound而不是额外的foreach.

这是在数据绑定时RowDataBound为每一行引发的事件。GridView假设DataSource类似于DataTable

protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        CheckBox check = (CheckBox)e.Row.FindControl("CheckBox1");
        CheckBox check2 = (CheckBox)e.Row.FindControl("CheckBox2");
        DataRow row = ((DataRowView)e.Row.DataItem).Row;
        int accesType = row.Field<int>("AccessType");
        check.Checked = accesType == 1;
        check2.Checked = accesType == 2;
    }
}
于 2013-06-26T13:25:29.573 回答
1

您可以将 AccessType 值添加到网格中的 HiddenField:

<asp:GridView ID="GridView" runat="server" AutoGenerateColumns="false"
        onrowdatabound="GridView_RowDataBound">
        <Columns>
            <asp:BoundField DataField="AccessGroup" HeaderText="Access Group" />
            <asp:BoundField DataField="FolderAccess" HeaderText="Folder Access" />
            <asp:HyperLinkField DataNavigateUrlFields="group_manager" DataNavigateUrlFormatString="groupinfo.aspx?group={0}"
                    DataTextField="group_manager" HeaderText="Group Manager" />
            <asp:BoundField DataField="AccessType" Visible="false" />
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:HiddenField ID="hdnAccessType" runat="server" Value='<%# Eval("AccessType") %>' />
                    <asp:CheckBox ID="chkReadOnly" runat="server" Enabled="false" />
                    <asp:CheckBox ID="chkModify" runat="server" Enabled="false" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

然后使用 RowDataBound 事件处理程序从 HiddenField 控件获取 AccessType 值并相应地设置复选框:

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            HiddenField hdnAccessType = (HiddenField)e.Row.FindControl("hdnAccessType");
            int accessType = int.Parse(hdnAccessType.Value.ToString());
            CheckBox chkReadOnly = (CheckBox)e.Row.FindControl("chkReadOnly");
            CheckBox chkModify = (CheckBox)e.Row.FindControl("chkModify");

            switch (accessType)
            {
                case 1:
                    chkReadOnly.Checked = true;
                    break;
                case 2:
                    chkModify.Checked = true;
                    break;
            }
        }
    }

希望这可以帮助。

于 2013-06-26T13:50:46.787 回答