rommelpabustan Ответов: 2

Как я могу добавить новые записи в datatable из datagridview после фильтрации


у меня есть форма на c#. форма имеет два вида datagridview. 1-й datagridview извлекает записи из базы данных(sql server)
И у него также есть флажки в его 1-м столбце, так что какой бы элемент ни был отмечен, он будет перенесен во 2-й datagridview.я использую datatable для переноса элементов во 2-й datagridview.у меня также есть текстовое поле, используемое для поиска элемента в 1-м gridview, поэтому элементы будут отфильтрованы. Нет никаких проблем в добавлении элементов на 2-м gridview, но когда я ищу элемент и добавляю его к существующим элементам на 2-м gridview, он добавляет только тот элемент, который я искал, и все существующие элементы на 2-м gridview исчезают. я использовал rowfilter для окна поиска.pls.help. спасибо

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

я попытался изменить код для поиска элементов в текстовом поле и удалить функцию RowFilter datatable, но это не сработало

Richard MacCutchan

На первый взгляд в вашем коде что-то не так. Но мы не можем видеть ваш код, поэтому невозможно сделать какие-либо предложения.

rommelpabustan

вот мой код для текстового поля поиска:(dgvCustProducts.Источник данных как DataTable).DefaultView.RowFilter = строка.Format("[ITEM NAME] LIKE '{0}%'", txtSearch.Текст);

rommelpabustan

а вот мой код для передачи предметов:

/передача записей datagridview с помощью datatable в другой datagridview(Form2)
пробовать
{

если (dgvCustProducts.Строк.Количество == 0)
{
Ящик для сообщений.Show("нет элементов для загрузки.Сначала выберите тип операции"., "Поле Требуется", MessageBoxButtons.Хорошо, MessageBoxIcon.Предупреждение);

}
еще
{
if (data == null)//решение для ссылки на объект не установлено ошибка для datatable
{
Ящик для сообщений.Show("Сначала выберите элементы, которые вы хотите перенести.", "поле обязательно", MessageBoxButtons.Хорошо, MessageBoxIcon.Предупреждение);
вернуть;
}

//еще если
//{


//}
еще
{
данные.Столбцы.Четкий();
данные.Четкий();
//создание столбцов для datatable
данные.Столбцы.Add("TRANSACTION ID", typeof(string));//0
данные.Столбцы.Add("PRODUCT ID", typeof(string));//1
данные.Столбцы.Add("QTY", typeof(double));//2
данные.Столбцы.Add("UNIT", typeof(string));//3
данные.Столбцы.Add("ARTICLES", typeof(string));//4
данные.Столбцы.Add("UNIT PRICE", typeof(decimal));//5
данные.Столбцы.Add("AMOUNT", typeof(decimal));//6

строка tr_prefix = "TR-";
int trans_idno = (new Random()).Next(100, 1000);
транзакция = tr_prefix + trans_idno.Метод toString();
сумма = кол-во * цена единицы измерения;

по каждому элементу (ячейки datagridviewrow Row в dgvCustProducts.Строки)
{

bool isChecked = конвертировать.ToBoolean(row.Cells["colTransfer"].Value);//исходный код
если (не этот флажок установлен)
{


if (dgvCustProducts.Избранные воробьи.Count >= 1)
{

кол-во = конвертация.ToDouble(row.Cells[1].Value);
если (кол-во == 0)
{
Ящик для сообщений.Show("пожалуйста, добавьте количество к продукту, который вы передаете", "количество", MessageBoxButtons.Хорошо, MessageBoxIcon.Восклицание);
вернуть;
}
еще
{
кол-во = конвертация.ToDouble(row.Cells[1].Value);
prod_id = строка.Ячейки[2].Значение.Метод toString();
единица измерения = строка.Ячейки[3].Значение.Метод toString();
item_name = строка.Ячейки[4].Значение.Метод toString();
цена = конвертировать.ToDouble(row.Cells[5].Value);
сумма = конвертация.ToDouble(row.Cells[1].Value) * конвертировать.ToDouble(row.Cells[5].Value);
data.Rows.Add(транзакция, prod_id, строка.Ячейки[1].Значение, строка.Ячейки[3].Значение, строка.Ячейки[4].Значение, строка.Ячейки[5].значение, сумма);

}

}


dgvSalesInv.DataSource = данные;
двойная сумма = 0;//ililipat lng ng pwesto. Дито илалагай
for (int i = 0; i < dgvSalesInv.Rows.Граф; ++i)
{
сумма += конвертация.Метод todouble(dgvSalesInv.РО

2 Ответов

Рейтинг:
2

Member 7969814

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

<script type="text/javascript">
   function Search_GridviewLocation(strKey) {
       var strData = strKey.value.toLowerCase().split(" ");
       var tblData = document.getElementById('<%= GridView4.ClientID %>');
       var rowData;
       for (var i = 1; i < tblData.rows.length; i++) {
           rowData = tblData.rows[i].cells[2].innerText;
           var styleDisplay = 'none';
           for (var j = 0; j < strData.length; j++) {
               if (rowData.toLowerCase().indexOf(strData[j]) >= 0)
                   styleDisplay = '';
               else {
                   styleDisplay = 'none';
                   break;
               }
           }
           tblData.rows[i].style.display = styleDisplay;
       }
   }


Рейтинг:
1

BillWoodruff

1 не очищайте столбцы: создайте столбцы один раз, а затем скопируйте структуру первого DataTable во второй:

dataGridView1.DataSource = data1;

data2 = data1.Clone(); // copies structure

dataGridView2.DataSource = data2;
2 Получите выбранные строки в первом DGV, а затем обновите второй DataTable:
IEnumerable<DataGridViewRow> selrows = dataGridView1.Rows.Cast<DataGridViewRow>().Where((DataGridViewRow row) =>
Convert.ToBoolean(row.Cells["colTransfer"].Value));

data2.Rows.Clear();

foreach (DataGridViewRow row in selrows)
{
    int ndx = row.Index;
    
    data2.Rows.Add(data1.Rows[ndx].ItemArray);
}
3 я не вижу, в чем проблема с добавлением дополнительных строк на основе поиска: получите индекс новых строк и используйте ту же технику для их добавления, как показано в № 2.

Или, может быть, установите флажки, соответствующие найденным строкам, на 'Checked, а затем обновите второй DataTable, привязанный ко второму DataGridView: очистите строки, а затем используйте код в #2,