2017-01-14 6 views
0

У меня есть 2 вида datagrid с одним datatable. Я пытаюсь иметь кнопку, которая при нажатии на нее добавляет строки из csv_datagridview в optim_datagridview. Ниже показано, что всякий раз, когда я отменяю выделение в csv_datagridview и снова нажимаю кнопку, он очищает этот выбор. Я бы хотел, чтобы каждый раз выбирал палку.C# Как скопировать из одной сетки данных в другую без перезаписывания моего предыдущего выбора?

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

Большое спасибо заранее :)

+0

Вам нужно объявить destList как свойство класса, а не внутри метода. Каждый раз, когда вы устанавливаете его значение в новый список (), вы очищаете все предыдущие данные и создаете новый список (), поэтому удалите эту строку из метода и поместите его как инициализатор в свойстве или поле класса. –

ответ

1

Непонятно, какова ваша точная проблема с маленьким кодом, который вы показываете, но из вашего заявления всякий раз, когда я снимаю выделение с записи в csv_datagridview и снова нажимаю кнопку, он очищает этот выбор. Я предполагаю, что если ничего не выбрано, данные в optimaldataGridView стираются, когда вы нажимаете кнопку «Добавить выбранную».

Предполагаю, что csv_datagridview привязан к столу. Ваш опубликованный код показывает создание нового списка destList, который вы заполняете выбранными строками из csv_datagridview. Затем вы устанавливаете источник данных optimaldataGridView на номер destList. Одна из проблем, которые я вижу на этой картинке, заключается в том, что как только вы покинете пункт if (selectedRowCount <= 9) ... destList больше не будет существовать. Как источник данных для DataGridView в вашей форме, я бы подумал, что вы хотите сохранить этот список глобальным до тех пор, пока форма открыта. В любом случае ... вы не добавляете выбранные строки, вы просто удаляете существующие строки, а затем добавляете то, что было выбрано в csv_datagridview.

Надеюсь, код ниже поможет. Я создал два DataTables, по одному для каждого DataGridView. Таблица данных csv_datagridview заполняется некоторыми данными, вторая таблица данных остается пустой. Затем просто добавьте выбранные строки из csv_datagridview в DataTable optimaldataGridView ... Затем обновите 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"); 
    } 
} 

Надеюсь, это поможет.

+0

Спасибо, я считаю, что это то, что я ищу.Я думаю, что мне придется добавить добавить все в компонент initialize в загрузку формы, потому что я импортирую данные на реальном времени с веб-сайта и не заполняется в сетке до загрузки формы. Я скоро обновлю вас и дам вам знать, работает ли это. –

0

Ваш код работает на моей стороне.

  • Создано DataTable для источника данных csv_datagridview.
  • Выбрано несколько строк в этой сетке.
  • Нажал кнопку, чтобы скопировать выбранные строки в 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; 
} 

Удостоверьтесь, что у вас нет событий, связанных с сетками, которые могут повлиять на выбор.