2

我有一个gridview,我在其中显示要在gridview行复选框中选中或取消选中的值..现在我想在gridview行中动态显示这些值,但它不会发生..所有复选框都将被选中,而结果应该是不同的 ..

这是我的硬编码代码条件,以显示结果很好...

string[] rolesarr = Roles.GetAllRoles();

    DataTable dTable = new DataTable();
    dTable.Columns.Add("Select", typeof(bool));
    dTable.Columns.Add("Username", typeof(string));
    Array.ForEach(rolesarr, r => dTable.Columns.Add(r, typeof(bool)));
    foreach (MembershipUser u in Membership.GetAllUsers())
    {
        DataRow dRow = dTable.NewRow();
        dRow[0] = false;
        dRow[1] = u.UserName;
        string[] roles = Roles.GetRolesForUser(u.UserName);
        dRow[2] = roles.Contains("Admin") ? true : false;
        dRow[3] = roles.Contains("DPAO User") ? true : false;
        dRow[4] = roles.Contains("GeneralUser") ? true : false;
        dTable.Rows.Add(dRow);
    }
    GridView1.DataSource = dTable;
    GridView1.DataBind();

现在我想让这个条件动态化,我已经为此编写了代码..

string[] rolesarr = Roles.GetAllRoles();

    DataTable dTable = new DataTable();
    dTable.Columns.Add("Select", typeof(bool));
    dTable.Columns.Add("Username", typeof(string));
    Array.ForEach(rolesarr, r => dTable.Columns.Add(r, typeof(bool)));
    foreach (MembershipUser u in Membership.GetAllUsers())
    {
        DataRow dRow = dTable.NewRow();
        dRow[0] = false;
        dRow[1] = u.UserName;
        string[] roles = Roles.GetRolesForUser(u.UserName);

        for (int i = 0; i < roles.Length; i++)
        {

            string rol = roles[i];

            for (int j = 2; j < dTable.Columns.Count; j++)
            {
                dRow[j] = roles.Contains(rol) ? true : false;

            }

        }
     dTable.Rows.Add(dRow);
    }
    GridView1.DataSource = dTable;
    GridView1.DataBind();

这是我的复选框的 RowDatabound 事件..

protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        CheckBox c0 = (CheckBox)e.Row.Cells[0].Controls[0];
        CheckBox c2 = (CheckBox)e.Row.Cells[2].Controls[0];
        CheckBox c3 = (CheckBox)e.Row.Cells[3].Controls[0];
        CheckBox c4 = (CheckBox)e.Row.Cells[4].Controls[0];
        c0.Enabled = c2.Enabled = c3.Enabled = c4.Enabled = true;
    }
}

请大家帮助我..提前谢谢...

4

1 回答 1

0

问题应该是您提供的双循环。

根据您的硬编码代码,您希望在数组中的角色rolesarrroles用户之间进行映射,以显示为每个用户检查了哪些角色。

要在 indext 2 - 4 处设置数据行的值,您将有两个循环,第一个循环重复 rolesarr数组,第二个循环重复roles数组并在第二个循环中比较它们

这是我的意思的代码:

string[] rolesarr = Roles.GetAllRoles();

DataTable dTable = new DataTable();

dTable.Columns.Add("Select", typeof(bool));
dTable.Columns.Add("Username", typeof(string));
Array.ForEach(rolesarr, r => dTable.Columns.Add(r, typeof(bool)));
foreach (MembershipUser u in Membership.GetAllUsers())
{
    DataRow dRow = dTable.NewRow();
    dRow[0] = false;
    dRow[1] = u.UserName;
    string[] roles = Roles.GetRolesForUser(u.UserName);

    for (int i = 0; i < rolesarr.Length; i++)
    {
        for (int j = 0; j < roles.Length; j++)
        {
            if (rolesarr[i] == roles[j])
            {
                dRow[i + 2] = true;
                break;
            }
        }
    }
    dTable.Rows.Add(dRow);
}
GridView1.DataSource = dTable;
GridView1.DataBind(); 

请注意,我在第二个循环中使用数据行索引作为i + 2 (dRow[i + 2]),因为您的角色列从 index=2 开始,而不是 0,并且长度必须等于rolesarr.Length您将它们用作角色列的长度。

于 2013-11-19T14:56:18.617 回答