Слияние DataGridView - PullRequest
       11

Слияние DataGridView

3 голосов
/ 20 августа 2011

Возможно ли объединить 2 отдельных DataGridView в C # в один? Я использую два отдельных SortableBindingList для каждого DataGridView.

Вот код для первого DataGridView с именем theChipDGV.

theChipList.Add(new Chip(splitLine[0], splitLine[1], xValue, yValue, rotation, splitLine[5]));
theChipDGV.DataSource = theChipList;

Вот код для второго DataGridView, который называется theDataBaseDGV.

theDataBaseList.Add(new DataBase(dataBaseSplit[0], dataBaseSplit[1], dataBaseSplit[2], dataBaseSplit[3], dataBaseSplit[4], dataBaseSplit[5], dataBaseSplit[6], 0));
theDataBaseDGV.DataSource = theDataBaseList;

EDIT:

theFinalList.Add(new Final(splitLine[0], splitLine[1], xValue, yValue, rotation, splitLine[5], dataBaseSplit[0], dataBaseSplit[1],
                           dataBaseSplit[2], dataBaseSplit[3], dataBaseSplit[4],dataBaseSplit[5], dataBaseSplit[6], 0));

OR

theFinalDGV.DataSource = theChipList + theDataBaseList;

OR

как-то иначе, так как оба из них, я не думаю, будут работать?


Если так, как это возможно?

EDIT2:

theLoadList.Add(new LoadLine(theChipList[0].Name, theChipList[0].PartNumber,
                theChipList[0].XPlacement, theChipList[0].YPlacement, theChipList[0].Rotation,
                theChipList[0].PkgStyle, theDataBaseList[0].PackageType, theDataBaseList[0].PartDescription,
                theDataBaseList[0].Feeder, theDataBaseList[0].Vision, theDataBaseList[0].Speed,
                theDataBaseList[0].Machine, theDataBaseList[0].TapeWidth, 0));

Однако, используя это, можно получить только одну строку, и мне нужно захватить каждую строку. Даже если один список больше другого, я бы хотел заполнить пустые места ..

Я пытался возиться с этим:

int chipRowCount = theChipDGV.Rows.Count;
int dataBaseRowCount = theDataBaseDGV.Rows.Count;
int greaterValue = 0;

if (chipRowCount > dataBaseRowCount)
    greaterValue = chipRowCount;
else
    greaterValue = dataBaseRowCount;

int i = 1;

while (i < greaterValue)
{
    // Place the above **EDIT2** code here. (theLoadList.Add(new LoadLine(...));
}

1 Ответ

3 голосов
/ 20 августа 2011

Здесь есть пара подходов.

Я не знаком с SortableBindingList, но вы можете объединить два списка в один, а затем связать его с DataGridView. Если тот факт, что два SortableBindingList содержат разные типы (один Chip, другой DataBase) является проблемой, вы всегда можете создать Интерфейс, и оба ваших типа реализуют его. Затем вы можете изменить тип T в ваших SortableBindingList s на ваш интерфейс, а затем объединить и связать этот объединенный список с вашим DataGridView.

Другой подход заключается в копировании строк обоих ваших DataGridViews в третий DataGridView. Я взял пример здесь и создал метод, который будет принимать DataGridView и возвращать массив его DataGridViewRows.

Вот метод:

private DataGridViewRow[] CloneDataGridViewRows(DataGridView dgv) {
    var rowArray = new DataGridViewRow[dgv.Rows.Count];
    for (int i = 0; i < dgv.Rows.Count; i++) {
        DataGridViewRow clonedRow = (DataGridViewRow)dgv.Rows[i].Clone();
        for (int c = 0; c < clonedRow.Cells.Count; c++) {
            clonedRow.Cells[c].Value = dgv.Rows[i].Cells[c].Value;
        }
        rowArray[i] = clonedRow;
    }
    return rowArray;
}

Затем вы можете использовать этот код для копирования строк в два ваших DGV (dataGridView1 и dataGridView2) в третий DGV (dataGridView3).

dataGridView3.Rows.AddRange(CloneDataGridViewRows(dataGridView1));
dataGridView3.Rows.AddRange(CloneDataGridViewRows(dataGridView2));

Обратите внимание, что этот метод скопирует «пустую» строку, добавленную в DGV, если значение DGV AllowUserToAddRows равно true. Если это так, и вам не нужна эта пустая строка, измените размер вашего rowArray на единицу меньше, чем я показываю, и проверьте новую строку во внешнем цикле for для такой строки:

if (!dgv.Rows[i].IsNewRow) {
    // Do the copy...
}

Кроме того, перед объединением убедитесь, что в целевом DGV столько же столбцов, сколько в исходных DGV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...