Удалить повторяющиеся значения из dataGridViewComboBoxColumn - PullRequest
0 голосов
/ 07 апреля 2011

Я использую DataGridViewComboBoxColumn, чтобы сделать ComboBox в DataGridView, но мой ComboBox недостаточно хорош.Мне нужно, чтобы мой ComboBox не имел повторных значений.Это пример:

Apple
Blackberry
Chrome
Apple

Я хочу удалить значения, которые появляются более одного раза.Как я могу это сделать?

Это мой код:

OleDbConnection conn = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
Dataset data = new Dataset();
OleDbDataAdapter adapter = new OleDbDataAdapter();
string path = "Data Source = "+".\\"+"test.accdb";
string conStr = "Provider = Microsoft.ACE.OleDb.12.0;"+@path;
conn.Open();
string sql = "SELECT * FROM Table1;"
cmd = new OleDbCommand(sql,conn);
adapter = new OleDbDataAdapter(cmd);
data = new Dataset();
adapter.Fill(data,"Table1");
DataGridViewComboBoxColumn testcolumn = new DataGridViewComboBoxColumn();
testcolumn.Name = "test na ja";
testcolumn.Datasource = data.table[0];
testcolumn.ValueMember = "Remedy";
testcolumn.DisplayMember = "Remedy";
dataGridview1.Columns.Add(testcolumn);
conn.Close()

Ответы [ 2 ]

0 голосов
/ 07 апреля 2011

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

Я добавил комментарий ниже, чтобы выделить строку, где применяется отличное - вы используете метод .ToTable (), который принимает логический параметр Distinct, чтобы указать только возвращаемые отличные строки.

[TestMethod]
public void CreateDistinctDataTable()
{
    DataTable originalTable = CreateDataTable();

    AddDataToTable("Fred", "Bloggs", originalTable);
    AddDataToTable("Fred", "Bloggs", originalTable);
    AddDataToTable("John", "Doe", originalTable);

    // This is the key line of code where we use the .ToTable() method
    DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);

    // The original table has two rows with firstname of Fred
    Assert.AreEqual(2, originalTable.Select("firstname = 'Fred'").Length);

    // The new table only has one row with firstname of Fred
    Assert.AreEqual(1, distinctTable.Select("firstname = 'Fred'").Length);
}

private DataTable CreateDataTable()
{
    DataTable myDataTable = new DataTable();

    DataColumn myDataColumn;

    myDataColumn = new DataColumn();
    myDataColumn.DataType = Type.GetType("System.String");
    myDataColumn.ColumnName = "firstname";
    myDataTable.Columns.Add(myDataColumn);

    myDataColumn = new DataColumn();
    myDataColumn.DataType = Type.GetType("System.String");
    myDataColumn.ColumnName = "lastname";
    myDataTable.Columns.Add(myDataColumn);

    return myDataTable;
}

private void AddDataToTable(string firstname,  string lastname, DataTable myTable)
{
    DataRow row = myTable.NewRow();

    row["firstname"] = firstname;            
    row["lastname"] = lastname;

    myTable.Rows.Add(row);
} 

Еще одна мысль: я бы предложил не выбирать * из таблицы в выражении SQL. Это может повлиять на производительность в будущем, если будет добавлено больше столбцов (особенно таких, как BLOB-объекты), а также может означать, что вы получите столбцы, которые нарушают характер вашего запроса.

0 голосов
/ 07 апреля 2011

изменить оператор SELECT, чтобы он возвращал различные значения remedy:

string sql = "SELECT DISTINCT remedy FROM Table1;"

и, если хотите, заказали:

string sql = "SELECT DISTINCT remedy FROM Table1 ORDER BY remedy ASC;"

или

string sql = "SELECT DISTINCT remedy FROM Table1 ORDER BY remedy DESC;"
...