Проверьте дубликаты перед копированием строк из одной сетки данных в другую. - PullRequest
0 голосов
/ 18 марта 2020

На самом деле я копирую строки из одного datagrid в другое в DataGridView Double Click Event, и все идет хорошо. Код здесь:

 //Void App
 void AddProducts(int ProdID, string Name, string ProductCode, int RetailPrice, int SalePrice, string BrandName, string Category, int QTY)
    {
        string[] row = { Convert.ToUInt32(ProdID).ToString(), Name, ProductCode, 
         Convert.ToInt32(RetailPrice).ToString(), Convert.ToInt32(SalePrice).ToString(), BrandName, Category, Convert.ToInt32(QTY).ToString()};

        dgViewProductsToSell.Rows.Add(row);
    }

 //Code

 private void dgViewProducts_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        string Name1 = this.dgViewProducts.CurrentRow.Cells["Name"].Value.ToString();
        int ProdID = Convert.ToInt32(dgViewProducts.CurrentRow.Cells["ProdID"].Value);
        string Name = dgViewProducts.CurrentRow.Cells["Name"].Value.ToString();
        string ProductCode = dgViewProducts.CurrentRow.Cells["ProductCode"].Value.ToString();
        int RetailPrice = Convert.ToInt32(dgViewProducts.CurrentRow.Cells["RetailPrice"].Value);
        int SalePrice = Convert.ToInt32(dgViewProducts.CurrentRow.Cells["SalePrice"].Value);
        string BrandName = dgViewProducts.CurrentRow.Cells["BrandName"].Value.ToString();
        string Category = dgViewProducts.CurrentRow.Cells["Category"].Value.ToString();
        int QTY = Convert.ToInt32(dgViewProducts.CurrentRow.Cells["QTY"].Value);

        AddProducts(Convert.ToInt32(ProdID), Name, ProductCode, Convert.ToInt32(RetailPrice), Convert.ToInt32(SalePrice), BrandName, Category, Convert.ToInt32(QTY));
 }

Как я могу проверить дубликаты записей перед копированием строк? Таким образом, 2-й datagridview может избежать повторяющихся записей.

Ответы [ 4 ]

0 голосов
/ 19 марта 2020

Вы можете использовать следующий код для удаления повторяющихся записей перед копированием таблицы данных.

Код:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable table = new DataTable();
            table.Columns.Add("Name");
            table.Columns.Add("Id");
            table.Columns.Add("Age");
            table.Rows.Add("test1",1001,22);
            table.Rows.Add("test1", 1001, 22);
            table.Rows.Add("test2", 1002, 23);
            table.Rows.Add("test3", 1003, 24);
            dataGridView1.DataSource = table;
        }

        private void dataGridView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            DataTable dt = (DataTable)dataGridView1.DataSource;
            dt = dt.DefaultView.ToTable(true);
            dataGridView2.DataSource = dt;
        }
    }

Результат: enter image description here

0 голосов
/ 18 марта 2020

Каждая строка должна иметь первичный ключ , обычно идентификатор. Я предполагаю, что это так.

Второе предположение: оба элемента управления datagridview привязаны к наборам данных / наборам данных или источникам привязки.

Итак, когда пользователь выбирает строку в сетка, получить базовый datarow . Это можно сделать с помощью функции databounditem. Затем вы можете получить идентификатор или первичный ключ.

Затем сравните две таблицы данных. Это более эффективно и безопасно, чем доступ к элементам управления пользовательского интерфейса. Существуют различные способы проверить, что запись уже существует в таблице данных, например, функция select. Другой вариант - использование LINQ.

Не пытайтесь обновить второе представление данных напрямую, вместо этого вы добавляете запись в базовую таблицу данных и позволяете обновлению самого представления данных.

Кажется, ваш код быть небезопасным Что произойдет, если пользователь дважды щелкнет по краям сетки? Текущая строка может быть -1. Вам необходимо добавить проверку.

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

Подводя итог, настоятельно советую использовать таблицы данных, даже если вы не читаете или не сохраняете в базу данных.

0 голосов
/ 18 марта 2020

Я собираюсь начать с этого лоскутного тестового приложения:

enter image description here

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

Следующий шаг: мы собираемся создать строго типизированный набор данных, доступный для данных, установить его основной ключ, поместите его в форму вместе с сеткой данных, с которой он связан, и мы собираемся заполнить его уникальным образом, дважды щелкнув по существующей сетке. Я смоделировал существующую сетку, как вы сделали. В действительности я хотел бы сделать ОБА эти сетки основанными на строго типизированной таблице данных, но я хотел показать, что вам не нужно, и мой совет по созданию строго типизированной таблицы данных может вписаться в вашу существующую идею вставки данных в просмотр таблицы данных напрямую, пока вы не будете готовы перейти на

Добавьте новый элемент типа DataSet в ваш проект. Щелкните правой кнопкой мыши проект, добавьте .. Новый элемент:

enter image description here

Дайте ему хорошее имя. Нет ничего хуже, чем код, заполненный Form1, DataSet1, GridView3, Button27


Когда он добавлен, дважды щелкните по нему, чтобы открыть область дизайна. Щелкните правой кнопкой мыши на поверхности и добавьте новую таблицу данных:

enter image description here


Дайте ему хорошее имя, несколько раз щелкните его правой кнопкой мыши и добавьте столбцы для всех вас. хотите, Имя, Код, Цена и т. д. c:

enter image description here


Не забудьте также указать им тип данных, поэтому не все является строкой!

enter image description here


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

enter image description here


Сохраните все, закройте конструктор набора данных, go, чтобы Дизайнер форм, выберите меню ПРОСМОТР, go ДРУГОЕ WINDOWS >> ДАННЫЕ. Вы также можете нажать Shift+Alt+D

Открыть панель ИСТОЧНИКИ ДАННЫХ, найти узел сетки вашего объекта данных (как бы вы его ни называли) и перетащить его на форму

enter image description here


Появилось сетевое представление, связанное с вашим пользовательским датабилем, а также некоторые новые элементы внизу. Вы можете удалить bindingnavigator:

enter image description here

(и переименовать экземпляр набора данных, чтобы он имел более хорошее имя, чем xxxxDataSet1)


Это все, что нам нужно для настройки приемника с датами и сеткой. Давайте отредактируем обработчик событий для двойного щелчка мышью. Я немного покопался и добавил еще одну функцию в качестве демонстрации, что, если строка ЕСТЬ там, мы можем обновить ее, в противном случае мы добавим ее:

    private void _dataGridViewSrc_MouseDoubleClick(object sender, MouseEventArgs e)
    {

        //my source datagrid is bound to a datatable. I use this to retrieve the current row related
        //to the row in the grid that was double clicked
        DataRow sourceRow = (_dataGridViewSrc.CurrentRow.DataBoundItem as DataRowView)?.Row;

        if(sourceRow == null)
            return;

        //because we made Name the primary key, the strongly typed datatable has a FindByName method
        //we pass it the string Name from the source datatable row (a grid row cell value in your case)
        NiceNameDataSet.UniqueProductsRow destRow = _niceNameDataSet.UniqueProducts.FindByName((string)sourceRow["Name"]);

        //FindByName returns NULL if the row wasn't found
        if(destRow == null)
        {
            //the row isn't there, so add it, using the data from the source row
            _niceNameDataSet.UniqueProducts.AddUniqueProductsRow(
                (string)sourceRow["Name"],
                (string)sourceRow["Code"],
                (double)sourceRow["Price"]
            );
        } else
        {
            //the row IS there, how about we update the fields using the row that was just clicked?
            //this demonstrated how much nicer it is to work with a strongly typed dataset/datatable
            //because all the columns have proper Properties, like row.Code, with proeprt datatypes
            //like string and double, rather than having to be referred to with a string name like 
            //row["Code"] and having to be cast from object to string, double all the time: messy 
            //and error prone
            destRow.Code = (string)sourceRow["Code"];
            destRow.Price = (double)sourceRow["Price"];

        }

    }

Я немного изменил цены и коды, чтобы продемонстрировать это другой подвиг. Теперь вы можете дважды щелкнуть любую строку «Хлеб», сколько захотите, и вы получите только одну строку в сетке назначения, и она меняет свои значения взад и вперед:

enter image description here

enter image description here

0 голосов
/ 18 марта 2020

Вы можете создать объект, который представляет каждую строку со свойствами для каждого столбца. Для этого объекта вы можете создать метод public bool Equals(object obj). С помощью объекта вы можете сравнить уже прочитанные объекты с вновь прочитанными объектами. Либо вручную, либо используя что-то Contains или аналогичные методы, которые являются частью классов List<> и Dictionary<>.

Все зависит от того, сколько у вас данных и какую строку вы считаете равной другой строке. Это равно / коллизия, если идентификатор продукта является дубликатом или все свойства также должны совпадать

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