【问题标题】:C# GUI Editable DataGridViewC# GUI 可编辑 DataGridView
【发布时间】:2017-10-15 00:47:39
【问题描述】:

必须满足哪些条件才能让用户通过GUI 编辑DataGridView?比如按F2进行修改,选择一行删除,或者添加一个新行?

当我将DataGridView.DataSource 绑定到本地集合对象(例如List<T>)时,我能够执行所有三个操作。

当我将DataGridView.DataSource 绑定到DataTableDataView 时,我还能够以图形方式完成这三个操作。

但是当我将DataGridView.DataSource 绑定到DbSet<T>.ToList<T>()DbSet<T>.ToArray<T>()(Entity Framework) 时,我只能修改现有行的非主键值,即使我启用了 delete添加函数通过DataGridView向导,具体设置AllowUserToAddRowsAllowUserToDeleteRowstrue。运行时,应用程序不会显示指示能够添加新行的 星号 符号。也不能删除一行。

但是,数据显示正确。

所以,我很困惑。上述数据源的哪些特征可能导致 GUI 中的不同行为?

谢谢

【问题讨论】:

    标签: c# .net winforms entity-framework datagridview


    【解决方案1】:

    DataGridView 控件允许用户添加行,如果 AllowUserToAddRow 设置为 true 并且基础数据源实现 IBindingList 返回 AllowNew 为 true。类似的删除规则。

    您可以查看AllowUserToAddRowsInternalAllowUserToDeleteRowsInternal 内部方法的源代码。

    作为结论,这些是基于数据源的允许操作:

    • List<T>:编辑
    • BindingList<T>:添加、编辑、删除(对于添加,T 应该有无参数构造函数)
    • Array:编辑
    • DataTable:添加、编辑、删除
    • BindingSource:取决于BindingSource 的底层数据源。如果它是IBindingList 的实现,它会向它询问,否则如果列表不是FixedSize,则允许所有操作,否则只允许编辑。例如,如果您将List<T> 设置为绑定源的数据源,然后将绑定源设置为数据网格视图的数据源,则列表将允许所有操作。
    • IBindingList:从实施中询问。

    【讨论】:

    • 谢谢。对于根本不是 IBindingList 实现的 List 等数据源,这是否意味着仅 AllowUserToAddRows 或 AllowUserToDeleteRows 属性就足以确定是否允许添加或删除行? List 似乎在您的结论中除了支持 Edit 和 Delete 之外还支持 Add 。谢谢
    • DataGridView 中编辑List<T> 的唯一方法是使用BindingSource。根据绑定源规则,如果将List<T>设置为BindingSource的数据源,然后将BindingSource设置为DataGridView的数据源,则可以添加编辑删除List<T>
    • 除了上述支持Add的条件外,别忘了有公共的无参数构造函数(通常你在一个普通的类中都有。)
    • 不客气。当您将 datagridview 绑定到数据表时,实际上它会绑定到其默认视图,即实现该接口的数据视图。
    • 礼萨,非常感谢。我现在有了更好的理解。你太棒了。
    【解决方案2】:
    1. 填充dataTable并将其用作datagridview的bining源

    1.1 在datagridview中做更改...

    public void DAL_UpdateStudentsTable(DataTable table) //DAL represents 3-tyer architecture (so data access layer)
    {
      using (SqlConnection sqlConn = new SqlConnection(connString))
      {
        using (SqlCommand cmd = new SqlCommand())
        {
          cmd.CommandText = @"UPDATE Students SET " +
                    "StudentID = @id, " +
                    "FirstName = @first, " +
                    "LastName = @last, " +
                    "Birthday = @birthday, " +
                    "PersonalNo = @personal " +
                    "WHERE StudentID = @oldId";
          cmd.Parameters.Add("@id", SqlDbType.Int, 5, "StudentID");
          cmd.Parameters.Add("@first", SqlDbType.VarChar, 50, "FirstName");
          cmd.Parameters.Add("@last", SqlDbType.VarChar, 50, "LastName");
          cmd.Parameters.Add("@birthday", SqlDbType.DateTime, 1, "Birthday");
          cmd.Parameters.Add("@personal", SqlDbType.VarChar, 50, "PersonalNo");
          SqlParameter param = cmd.Parameters.Add("@oldId", SqlDbType.Int, 5, "StudentID");
          param.SourceVersion = DataRowVersion.Original;
          cmd.Connection = sqlConn;
          using (SqlDataAdapter da = new SqlDataAdapter())
          {
            da.UpdateCommand = cmd;
            da.Update(table);
          }
        }
      }
    }
    
    1. 当您想要更新数据库时,只需创建一个更新命令并按照您在上面看到的那样进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 2023-03-26
      • 2012-04-05
      相关资源
      最近更新 更多