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

C#如何在不覆盖之前选择的情况下从一个数据网格复制到另一个数据网格?,c#,datagridview,datagrid,C#,Datagridview,Datagrid,我有两个datagrid视图和一个datatable。我试图有一个按钮,当点击它时,它会将csv_datagridview中的行添加到optimal_datagridview中。然而,每当我在csv_datagridview中取消选择一个条目并再次点击按钮时,下面的操作就会清除该选择。我希望每次都有选择棒 if (selectedRowCount <= 9) { List<object> destL

我有两个datagrid视图和一个datatable。我试图有一个按钮,当点击它时,它会将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;

if(selectedRowCount您的代码对我有效

  • 为csv_datagridview的数据源创建了一个DataTable
  • 在此网格中选择了一些行
  • 单击按钮将所选行复制到 优化DataGridView
选定的行仍处于选定状态

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;
}
public Form1()
{
初始化组件();
DataTable dt=新的DataTable();
dt.ReadXml(Application.StartupPath+@“\test.xml”);
csv_datagridview.SelectionMode=DataGridViewSelectionMode.FullRowSelect;
csv_datagridview.DataSource=dt;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
List destList=新列表();
foreach(csv中的datagridview行\u datagridview.SelectedRows)
destList.Add(row.DataBoundItem);
optimaldataGridView.DataSource=destList;
}

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

您显示的小代码不清楚您的确切问题是什么,但是从您的声明中,每当我在
csv\u datagridview
中取消选择条目并再次点击按钮时,它会清除该选择。我猜如果没有选择任何内容,则按“添加选定项”按钮时,
optimaldataGridView
中的ata将清除

我将假定
csv\u datagridview
绑定到一个表。您发布的代码显示了新列表
destList
的创建,您用
csv\u datagridview
中选择的行填充该列表。然后您将
optimaldataGridView
数据源设置为
destList
。我在这张图片中看到的一个问题是如果(selectedRowCount 0)退出
if,则{
foreach(csv中的datagridview行\u datagridview.SelectedRows){
DataRowView dr=(DataRowView)row.DataBoundItem;
表2.Rows.Add(dr.Row.ItemArray[0],dr.Row.ItemArray[1],dr.Row.ItemArray[2]);
}
optimaldataGridView.Refresh();
}
}
私有数据表GetTable(字符串名称){
DataTable=新的DataTable(名称);
表.列.添加(“col1”);
表.列.添加(“col2”);
表.列.添加(“col3”);
返回表;
}
私有void FillTable(数据表){
对于(int i=0;i<10;i++){
表。行。添加(“R”+i+“C0”、“R”+i+“C1”、“R”+i+“C2”);
}
}

希望这会有所帮助。

您需要将destList声明为类的属性,而不是在方法中。每次将其值设置为new List()时,您都会清除所有以前的数据并创建一个新列表(),因此从方法中删除该行,并将其作为初始值设定项放置在类属性或字段中。谢谢,我相信这就是我要寻找的。我想我必须将initialize组件中的所有内容添加到表单加载中,因为我正在从网站导入实时数据,在表单加载之前它不会填充到网格中。我会很快向您提供最新信息,并让您知道这是否有效。
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");
  }
}