Member 14895792 Ответов: 2

Как я могу скопировать выбранные данные столбца и строки из одного datagridview в другой в C# с помощью checkedlistbox.


как я могу скопировать выбранные данные столбца и строки из одного datagridview в другой в c# с помощью checkedlistbox.

есть два вида datagridview, они есть; datagridview1 и datagridview2.
затем отобразите данные sql в datagridview1. и добавьте столбец "select" с флажками в datagridview1.
после этого добавьте кнопку "Копировать" и checkedlistbox для выбора столбцов, которые нам нужно скопировать/передать данные в datagridview2.

chekAll = checkedlistbox (if (chekAll.Проверено == верно))
когда все элементы выбраны в checkedlistbox. все выбранные данные копируются из datagridview1(dgOne) в datagridview2(dgTwo). этот код в порядке....

но проблема заключается во втором коде (else if (chekAll.Проверено == ложь))*****
проблема заключается в том, что при выборе строк и столбцов с помощью checkedlistbox1 из datagriview1(dgOne) и нажатии кнопки "копировать" выбранные данные в Столбцах записываются строка за строкой в один столбец.

"""когда я выбираю некоторые элементы в checkedlistbox(chekAll), как я могу скопировать или передать значения выбранных строк и соответствующих столбцов из dgOne в dgTwo?????? """

это сообщение об ошибке при запуске второго кода
"входной массив длиннее, чем количество столбцов в этой таблице"

Что я уже пробовал:


if (chekAll.Checked == true)
                {
                    foreach (DataGridViewRow item in dgOne.Rows)
                    {
                        if ((bool)item.Cells[0].Value == true)
                        {

                            DataTable dt = new DataTable();
                            dt.Columns.Add("Serial No:");
                            dt.Columns.Add("Register No:");
                            dt.Columns.Add("Acedemic Year");
                            dt.Columns.Add("Full Name");
                            dt.Columns.Add("Name with Initial");
                            dt.Columns.Add("Course");
                            dt.Columns.Add("Address");
                            dt.Columns.Add("Telephpne No:");
                            dt.Columns.Add("Province");
                            dt.Columns.Add("District");
                            dt.Columns.Add("AGA Division");
                            dt.Columns.Add("Base of Recruitment");

                            foreach (DataGridViewRow row in dgOne.Rows)
                            {
                                bool isSelected = Convert.ToBoolean(row.Cells["Column0"].Value);
                                if (isSelected)
                                {
                                    dt.Rows.Add(row.Cells[1].Value, row.Cells[2].Value, row.Cells[3].Value, row.Cells[4].Value, row.Cells[5].Value, row.Cells[6].Value, row.Cells[7].Value, row.Cells[8].Value, row.Cells[9].Value, row.Cells[10].Value, row.Cells[11].Value, row.Cells[12].Value);
                                }
                                dgTwo.DataSource = dt;
                            }


                        }
}


else if (chekAll.Checked == false)
                {

                    foreach (DataGridViewRow item in dgOne.Rows)
                    {
                        if ((bool)item.Cells[0].Value == true)
                        {

                            DataTable dt = new DataTable();
                            dgTwo.DataSource = null;
                            foreach (string s in checkedListBox1.CheckedItems)
                            {
                                dt.Columns.Add(s);

                            }

                            foreach (DataGridViewRow row in dgOne.Rows)
                            {
                                bool isSelected = Convert.ToBoolean(row.Cells["Column0"].Value);
                                if (isSelected)
                                {
                                    dt.Rows.Add(row.Cells[1].Value, row.Cells[2].Value, row.Cells[3].Value, row.Cells[4].Value, row.Cells[5].Value, row.Cells[6].Value, row.Cells[7].Value, row.Cells[8].Value, row.Cells[9].Value, row.Cells[10].Value, row.Cells[11].Value, row.Cells[12].Value);
                                }
                                dgTwo.DataSource = dt;
                            }


                        }
                    }
}

Garth J Lancaster

Вы не говорите, что "неправильно" с вашим кодом / что он делает (или нет), или даже если он компилируется - может быть, это идея для использования Улучшить вопрос и обновите его ..

Member 14895792

Я улучшил вопрос

2 Ответов

Рейтинг:
1

Richard MacCutchan

Вы используете то же самое DataTable для обеих сторон DataGridViews таким образом, они оба будут показывать все строки, включая дубликаты, которые вы добавляете. Вы должны использовать DataGridViewRow.Метод Клонирования (System.Окна.Формы) | Microsoft Docs[^] чтобы создать новый DataGridViewRow объекты и добавить их к dgTwo В качестве альтернативы создайте новый DataTable и используйте это как источник для dgTwo.


Рейтинг:
0

Garth J Lancaster

Самая большая проблема, которую я вижу с вашим кодом, заключается в том, что у вас есть две вещи во "внутренних циклах" (и слишком много циклов), которые, вероятно, при немного лучшем дизайне не должны быть там, например

dgTwo.DataSource = dt;
Я бы взял эту строку "оттуда" и создал новую функцию, которая возвращает этот datatable, а затем обновляет 2-й datatable, так что
DataTable dt = getRowsToCopy();
dgTwo.DataSource = dt;
Точно так же и это
if (chekAll.Checked == true)
{
  foreach (DataGridViewRow item in dgOne.Rows)
  {
    if ((bool)item.Cells[0].Value == true)
    {
      DataTable dt = new DataTable();
      ...
было бы лучше "снаружи" петель, так что, может быть,
[Modifiers] DataTable getRowsToCopy()
{
  DataTable dt = new DataTable();
  dt.Columns.Add("Serial No:");
  dt.Columns.Add("Register No:");
  dt.Columns.Add("Acedemic Year");
  dt.Columns.Add("Full Name");
  dt.Columns.Add("Name with Initial");
  dt.Columns.Add("Course");
  dt.Columns.Add("Address");
  dt.Columns.Add("Telephpne No:");
  dt.Columns.Add("Province");
  dt.Columns.Add("District");
  dt.Columns.Add("AGA Division");
  dt.Columns.Add("Base of Recruitment");

  if (chekAll.Checked == true)
  {
    foreach (DataGridViewRow item in dgOne.Rows)
    {
      if ((bool)item.Cells[0].Value == true) 
      {
        bool isSelected = Convert.ToBoolean(row.Cells["Column0"].Value);
        if (isSelected)
        {
          dt.Rows.Add(row.Cells[1].Value, row.Cells[2].Value, row.Cells[3].Value, row.Cells[4].Value, row.Cells[5].Value, row.Cells[6].Value, row.Cells[7].Value, row.Cells[8].Value, row.Cells[9].Value, row.Cells[10].Value, row.Cells[11].Value, row.Cells[12].Value);
        }
      }
    }
  }
  return dt;
}


Отказ от ответственности : непроверенный, просто быстро перестроенный