繁体   English   中英

数据源已绑定到DataGridView时将字符串列表添加到DataGridView

[英]c# - Add list of strings to the DataGridView when the DataSource is already bonded to DataGridView

我正在一个项目中,我需要开发一个功能来向用户分配/修改/删除角色

我有一个附加到DataGridView的DataSource的用户角色列表,如下所示。

dgvAssignedRoles.DataSource = _userBll.ReadUserRoles(userId);

如下图所示:

UserRoles

我想向用户添加更多角色(例如HR_Admin,Manager_Role,EndUser_Role等),这些角色将从另一种形式的“角色”列表中获取

RoleList表格-

// Global Declaration
public List<string> SeletedRoleList { get; set; }

// Inside the Add function
SeletedRoleList = new List<string>();
foreach (DataGridViewRow row in dgvDataList.Rows)
{
    if (row.Selected)
    {
        string str = row.Cells[0].Value.ToString();
        SeletedRoleList.Add(str);
    }
}

而且我正在尝试将这些SelectedRoleList添加到已经具有某些角色的DataGridView中,但是它在下面引发了错误。

用户表格-

        var rolelistform = new RoleList();
        rolelistform.ShowDialog();

        foreach (var v in rolelistform.SeletedRoleList)
        {
            dgvAssignedRoles.Rows.Add(v);
        }

当控件是数据绑定的时,不能以编程方式将行添加到DataGridView的rows集合中。

我知道一旦使用DataSource属性绑定到数据,就无法将行直接显式添加到DataGridView。

任何人都有一个主意,我该如何实现并将行显式添加到DataSource属性。

谢谢!

        DataTable DT = (DataTable)dgvAssignedRoles.DataSource;
        DataRow DR = DT.NewRow();
        DR[0] = "your Roles";
        DT.Rows.Add(DR);

将数据源绑定到数据表并添加新行后

最后,我自己找出了最佳解决方案。

在用户窗体中,声明一个全局List<string>变量

// Global Declaration    
private static List<string> AssignedRoleList { get; set; }

然后将现有的用户角色分配给此全局变量AssignedRoleList并将用户角色数据绑定到DataGridView。 下面是代码。

AssignedRoleList = new List<string>();
AssignedRoleList = _userBll.ReadUserRoles(userId);
if (AssignedRoleList.Count > 0)
{
    var source = new BindingSource {DataSource = AssignedRoleList.Select(x => new {Roles = x})};
    dgvAssignedRoles.DataSource = source;
}

然后,在将新的SelectedRoleList添加到AssignedRoleList并将其绑定到DataGridView之后。

NewRoleList = new List<string>();
// Assigned Old user roles to the new one.
if (AssignedRoleList != null) NewRoleList = AssignedRoleList;

foreach (var v in dataviewform.SeletedDataList)
{
    bool status = true;
    // Check if user already have the roles
    if (dgvAssignedRoles.Rows.Cast<DataGridViewRow>().Any(row => Equals(row.Cells[0].Value, v)))
    {
        MessageBox.Show("Role already exist.");
        status = false;
    }
    // Adding the new selected roles to the existence user role if not present
    if (status)
        NewRoleList.Add(v);
    }
    // Finally attaching the both new and old user roles to datagridview
    var source = new BindingSource {DataSource = NewRoleList.Select(x => new {Roles = x})};
    dgvAssignedRoles.DataSource = source;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM