如何使用 Entity Framework for Windows 表单向 Datagridview 动态添加新列

How to dynamically add a new column to a Datagridview using Entity Framework for Windows form

我的数据库对象是以下 class 使用 Sqlite。我可以使用下面的代码轻松地将此 class 绑定到 datagridview Windows 表单:

public partial class ClientSystemHardware
{
    public int id { get; set; }
    public int client_number { get; set; }
    public string client_name { get; set; }
    public string pc_manufacturer { get; set; }
    public string pc_architecture { get; set; }
    // etc…
}

clientHardwareEntities _dataObject = null;

private void LoadDataSource()
{
    string dbName =  GetDBName(1);

    try
    {
        _dataObject = new clientHardwareEntities(dbName);
        dataGV.DataSource = _dataObject.ClientSystemHardwares.ToList();
    }
    catch (Exception ex)
    {
        if (ex.InnerException != null)
        {
            MessageBox.Show(ex.InnerException.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else
        {
            MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

private void btnValidate_Click(object sender, EventArgs e)
{
    try
    {
        dataGV.EndEdit();
        _dataObject.SaveChanges();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
    }
}

我正在使用 Entity Framework v6.3000 for .NET 4.0 和 System.Sqlite.dll v1.0113。

我想动态添加一个新列,其中包含在使用 Entity framework 数据库上下文节省时不应干扰的行号。

你能给我一些指导吗?

不清楚网格数据源是什么类型。我假设它是来自 SQLite 的 DataTableList<ClientSystemHardware>。根据您的评论,我猜您想要一列……”其中包含行号” ……指的是网格中的“行”号。如果是这种情况,那么下面是一种可能的解决方案。

与其乱加一列,不如利用网格的 RowHeader 列。如果我们创建一个将每一行 header 设置为该行索引值的方法。这样我们就不必将列添加到网格中。此外,您可以将 AutoGenerateColumns 设置为 true 并删除手动添加列的代码。但是,您仍然需要一种方法来设置行 header 值,它可能类似于...

private void setRowHeaderValues() {
  foreach (DataGridViewRow row in dataGridView1.Rows) {
    if (!row.IsNewRow) {
      row.HeaderCell.Value = (row.Index + 1).ToString();
    }
  }
}

我们可以在数据加载到网格后调用此方法...但是,有两个地方需要调用此代码以保持一致的顺序...1) 添加行时 2)当删除一行时。连接这两个方法后,我们就“不必”在加载或更改网格的数据源时调用该方法。

用于添加和删除行…

private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) {
  setRowHeaderValues();
}

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
  setRowHeaderValues();
}

DataGridView 连同按钮拖放到表单上,然后复制下面的代码来测试它。请注意,代码不会向网格中添加列。该代码使用数据库中的列。 …

DataTable GridTable;

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  GridTable = GetDataFromDB();
  dataGridView1.DataSource = GridTable;
  dataGridView1.RowHeadersWidth = 60;
}

private void setRowHeaderValues() {
  foreach (DataGridViewRow row in dataGridView1.Rows) {
    if (!row.IsNewRow) {
      row.HeaderCell.Value = (row.Index + 1).ToString();
    }
  }
}

private DataTable GetDataFromDB() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Col0", typeof(string));
  dt.Columns.Add("Col1", typeof(string));
  dt.Columns.Add("Col2", typeof(string));
  for (int i = 0; i < 15; i++) {
    dt.Rows.Add("C0R" + i, "C1R" + i, "C2R" + i);
  }
  return dt;
}


private void dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) {
  setRowHeaderValues();
}

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
  setRowHeaderValues();
}

private void button1_Click(object sender, EventArgs e) {
  GridTable = GetDataFromDB();
  dataGridView1.DataSource = null;
  dataGridView1.DataSource = GridTable;
}