C#GUI可编辑DataGridView

时间:2017-10-15 00:47:40

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

用户可以通过 GUI 编辑DataGridView必须满足哪些条件?例如按F2进行修改,选择要删除的行或添加新行?

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

当我将DataGridView.DataSource绑定到DataTableDataView时,我也能够以图形方式完成所有这三项工作。

但是当我将DataGridView.DataSource绑定到DbSet<T>.ToList<T>()DbSet<T>.ToArray<T>()Entity Framework)时,我只能修改现有行的非主键值,即使我已启用<通过DataGridView向导删除和添加功能,并专门将AllowUserToAddRowsAllowUserToDeleteRows设置为true。运行时,应用程序将不会显示星号符号,表示可以添加新行。也无法删除行。

然而,数据显示正确。

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

由于

2 个答案:

答案 0 :(得分:2)

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

您可以查看AllowUserToAddRowsInternalAllowUserToDeleteRowsInternal内部方法&#39;源代码。

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

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

答案 1 :(得分:0)

  1. 填写dataTable并将其用作datagridview的结合源
  2. 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. 如果要更新数据库,只需创建一个更新命令,并按照上面的说明进行操作。