【问题标题】:c# - Add list of strings to the DataGridView when the DataSource is already bonded to DataGridViewc# - 当 DataSource 已绑定到 DataGridView 时,将字符串列表添加到 DataGridView
【发布时间】:2016-08-21 14:53:17
【问题描述】:

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

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

dgvAssignedRoles.DataSource = _userBll.ReadUserRoles(userId);

如下所示:

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

角色列表表单-

// 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 的行集合中。

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

任何人都知道如何实现这一点并将行显式添加到 DataSource 属性。

谢谢!

【问题讨论】:

  • 将它们添加到数据源列表 (SeletedRoleList ?)

标签: c# .net winforms datagridview


【解决方案1】:
        DataTable DT = (DataTable)dgvAssignedRoles.DataSource;
        DataRow DR = DT.NewRow();
        DR[0] = "your Roles";
        DT.Rows.Add(DR);

绑定数据源后转换成DataTable并添加新的Rows

【讨论】:

    【解决方案2】:

    最后我自己想出了最好的解决方案。

    在用户表单中,声明一个全局 List&lt;string&gt; 变量

    // 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 2013-12-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多