Сравнение двух DataGridView и удаление одинаковых строк в C # - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть 2 DataGridViews.После выполнения некоторых операций в моем первом DataGridView я перенесу строки во второй DataGridView.Теперь я хочу сделать это.Во втором моем DataGridView я не хочу добавлять строки, которые совпадают с первым DataGridView.

Мой DataGridView1 выглядит так:

           Column 1                Column 2
       ---------------------------------------
           hello friends              250
           hi guys                    15
           good day                   15684
           old days                   156153
           bye bye                    6143

Если мой DataGridView2 выглядит так;

           Column 1                Column 2
       ---------------------------------------
           new coders                 88
           hello friends              250
           january february           31
           such good                  1684
           play music                 1553
           bye bye                    6143

Я не хочу видеть одинаковые строки в моем DataGridView2 (из DataGridView1) и не хочу его добавлять.Таким образом, мой DataGridView2 должен выглядеть следующим образом:

           Column 1                Column 2
       ---------------------------------------
           new coders                 88
           january february           31
           such good                  1684
           play music                 1553

Это мой код:

       connection.Open();
       string[] ss = listBox.SelectedItem.ToString().Split(' ');
       int css = ss.Count();
       for (int mi = 0; mi < css; mi++)
       {
           string mq = "SELECT c1, c2, c3 FROM myTable WHERE c1='" + ss[mi] + "' OR c2='" + ss[mi] + "'";
           SqlDataAdapter da = new SqlDataAdapter(mq, connection);
           DataTable dt1 = new DataTable();
           sd.Fill(dt1);
           foreach (DataRow r in dt1.Rows)
           {
               dgv1.Rows.Add(r["c1"].ToString() + " " + r["c2"].ToString(), r["c3"]);
           }
       }
       //Some insignificant operations.
       for (int mi2 = 0; mi2 < countOFMYNEWFORDGV1; mi2++)
       {
           string mySecondQuery= "SELECT c1, c2, c3 FROM myTable WHERE c1='" + myNEWFORDGV1[mi2] + "' OR c2='" + myNEWFORDGV1[mi2] + "'";
           SqlDataAdapter secondDA= new SqlDataAdapter(mySecondQuery, conection);
           DataTable dtForSecond= new DataTable();
           secondDA.Fill(dtForSecond);
           foreach (DataRow mySecondRow in dtForSecond.Rows)
           {
               dgv2.Rows.Add(mySecondRow["c1"].ToString() + " " + mySecondRow["c2"].ToString(), mySecondRow["c3"]);                        
           }
       }
       con.Close();

Примечание 1. Я изменил свой код.

Примечание 2. Пожалуйста, поделитесь своимиполный ответ.Большое вам спасибо.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Эту проблему можно решить одним из следующих двух способов.

  1. Извлечение данных из обеих таблиц данных и удаление дублирующихся строк в коде C #.
  2. Не извлекать дублирующиеся строкииз самой базы данных.

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

Фактические данные в таблице и впеременные предполагаются на основе общего кода.

Для начала в базе данных есть таблица 'myTable' со следующими данными.

   c1   |     c2    | c3   
----------------------------
 hello  |  friends  | 250
 hi     |  guys     | 15
 good   |  day      | 15684
 old    |  days     | 156153
 bye    |  bye      | 6143
 new    |  coders   | 88
 january|  february | 31
 such   |  good     | 1684
 play   |  music    | 1553

Ниже приведен код, написанный для удаления дубликата.строк при отображении данных в GridView2.

var sqlConnection = new SqlConnection("Data Source=<<dbserver>>; Initial Catalog=<<dbname>>;uid=<<uid>>;password=<<password>>");

var adapter = new SqlDataAdapter();

var str = "'" + string.Join("','", ss) + "'";

// Instead of looping thru all the items of ss to query the database again and again
// I am using IN query to query the database in one opration.
string sqlstmt = "SELECT * FROM myTable where c1 IN (" + str + ") or c2 IN (" + str +")";
DataSet dataSet = new DataSet();

sqlConnection.Open();
adapter = new SqlDataAdapter(sqlstmt, sqlConnection);
adapter.Fill(dataSet);
sqlConnection.Close();
dataGridView1.DataSource = dataSet.Tables[0];

//With above code GridView1 displayed data a following.
   c1   |     c2    | c3   
----------------------------
 hello  |  friends  | 250
 hi     |  guys     | 15
 good   |  day      | 15684
 old    |  days     | 156153
 bye    |  bye      | 6143

// With following line of code I am trying to remove duplicate query parameters.
// I am doing this because Same SELECT statement is being used 
// to query the data for both GridView1 and GridView2.
// Only the parameter value changes.
myNEWFORDGV1 = myNEWFORDGV1.Except(ss).ToArray();

str = "'" + string.Join("','", myNEWFORDGV1) + "'";

string query = "SELECT * FROM myTable where c1 IN (" + str + ") or c2 IN (" + str + ")";
dataSet = new DataSet();
adapter = new SqlDataAdapter(query, sqlConnection);
adapter.Fill(dataSet);
sqlConnection.Close();
dataGridView2.DataSource = dataSet.Tables[0];

GridView2 will display following data now.
   c1   |     c2    | c3   
----------------------------
 new    |  coders   | 88
 january|  february | 31
 such   |  good     | 1684
 play   |  music    | 1553

Попробуйте понять логику этого кода и применить его в своем сценарии использования.Это должно решить вашу проблему с дублирующимися строками.

0 голосов
/ 17 февраля 2019

Вместо того, чтобы проходить по каждой строке, я бы предложил получить результат в одном запросе.Используя левое внешнее объединение, мы получим все результаты DataGridView2 с общей записью DataGridView1, затем отфильтруем требуемую запись по фильтру нулевых значений.

GO

  ;with cte as (
    Select dg2.[Column 1] as c1, dg2.[Column 2] as c2, dg1.[Column 1] as dc1 
    from DataGridView2 as dg2 left outer join DataGridView1 as dg1 
    on dg2.[Column 1]=dg1.[Column 1] and dg2.[Column 2]=dg1.[Column 2] )
  select * from cte where dc1 is null

GO

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

Если возникнет путаница, то отправьте мне запрос на то же.

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