C#如何在不覆盖之前选择的情况下从一个数据网格复制到另一个数据网格?

时间:2017-01-14 00:14:18

标签: c# datagridview datagrid

我有2个数据网格视图和一个数据表。我想要一个按钮,当点击它时,它会将csv_datagridview中的行添加到optimal_datagridview。但是,无论何时我取消选择csv_datagridview中的条目并再次点击该按钮,它都会清除该选择。我想每次都有选择棒。

  if (selectedRowCount <= 9)
                {


                    List<object> destList = new List<object>();
                    foreach (DataGridViewRow row in csv_datagridview.SelectedRows)
                        destList.Add(row.DataBoundItem);
                    optimaldataGridView.DataSource = destList;

enter image description here

enter image description here

提前非常感谢你:)

2 个答案:

答案 0 :(得分:1)

目前还不清楚您所显示的小代码究竟是什么问题,但是当您在csv_datagridview中取消选择某个条目并再次点击该按钮时,会从您的语句中清除该选项。我猜测如果没有选择任何内容,当您按下添加选定按钮时,optimaldataGridView中的数据会清除。

我将假设csv_datagridview绑定到一个表。您发布的代码显示了新列表destList的创建,您可以使用csv_datagridview中的选定行填充该列表。然后,将optimaldataGridView数据源设置为destList。我在此图片中看到的一个问题是,只要您离开if (selectedRowCount <= 9)条款,destList将不再存在。作为表单上DataGridView的数据源,我认为只要表单处于打开状态,您就希望将此List保持为全局。无论哪种方式......您没有添加所选行,只需删除现有行,然后添加csv_datagridview中选择的内容即可。

我希望下面的代码会有所帮助。我创建了两个DataTable,每个DataGridView一个。 csv_datagridview数据表填充了一些数据,第二个数据表留空。然后,只需将csv_datagridview中选定的行添加到optimaldataGridView的DataTable ...然后刷新optimaldataGridView

DataTable table1;
DataTable table2;

public Form1() {
  InitializeComponent();
  csv_datagridview.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  optimaldataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  table1 = GetTable("table1");
  table2 = GetTable("table2");
  FillTable(table1);
  csv_datagridview.DataSource = table1;
  optimaldataGridView.DataSource = table2;
}

private void button1_Click(object sender, EventArgs e) {
  if (csv_datagridview.SelectedRows.Count > 0) {
    foreach (DataGridViewRow row in csv_datagridview.SelectedRows) {
      DataRowView dr = (DataRowView)row.DataBoundItem;
      table2.Rows.Add(dr.Row.ItemArray[0], dr.Row.ItemArray[1], dr.Row.ItemArray[2]);
    }
    optimaldataGridView.Refresh();
  }
}

private DataTable GetTable(string name) {
  DataTable table = new DataTable(name);
  table.Columns.Add("col1");
  table.Columns.Add("col2");
  table.Columns.Add("col3");
  return table;
}

private void FillTable(DataTable table) {
  for (int i = 0; i < 10; i++) {
    table.Rows.Add("R" + i + "C0", "R" + i + "C1", "R" + i + "C2");
  }
}

希望这有帮助。

答案 1 :(得分:0)

您的代码正在我身边。

  • 为csv_datagridview创建了一个DataTable数据源。
  • 在此网格中选择了一些行。
  • 单击按钮将选定的行复制到 optimaldataGridView

仍然会选中所选行。

public Form1()
{
   InitializeComponent();
   DataTable dt = new DataTable();
   dt.ReadXml(Application.StartupPath + @"\test.xml");
   csv_datagridview.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
   csv_datagridview.DataSource = dt;
}

private void button1_Click(object sender, EventArgs e)
{
   List<object> destList = new List<object>();
   foreach (DataGridViewRow row in csv_datagridview.SelectedRows)
      destList.Add(row.DataBoundItem);
   optimaldataGridView.DataSource = destList;
}

确保没有可能影响选择的网格附加事件。