Is there a way to find a value in DataTable in C# without doing row-by-row operation?
The value can be a part of (a substring of row[columnName].value , separated by comma) a cell in the datatable and the value may be present in any one of columns in the row.
bluish
26k27 gold badges120 silver badges179 bronze badges
asked Mar 11, 2009 at 9:12
A DataTable or DataSet object will have a Select Method that will return a DataRow array of results based on the query passed in as it’s parameter.
Looking at your requirement your filterexpression will have to be somewhat general to make this work.
myDataTable.Select("columnName1 like '%" + value + "%'");
answered Mar 11, 2009 at 9:25
Andy RoseAndy Rose
16.7k7 gold badges42 silver badges49 bronze badges
2
Maybe you can filter rows by possible columns like this :
DataRow[] filteredRows =
datatable.Select(string.Format("{0} LIKE '%{1}%'", columnName, value));
answered Mar 11, 2009 at 9:26
CanavarCanavar
47.6k17 gold badges91 silver badges122 bronze badges
1
AFAIK, there is nothing built in for searching all columns. You can use Find
only against the primary key. Select
needs specified columns. You can perhaps use LINQ, but ultimately this just does the same looping. Perhaps just unroll it yourself? It’ll be readable, at least.
answered Mar 11, 2009 at 9:26
Marc GravellMarc Gravell
1.0m261 gold badges2550 silver badges2888 bronze badges
this question asked in 2009 but i want to share my codes:
Public Function RowSearch(ByVal dttable As DataTable, ByVal searchcolumns As String()) As DataTable
Dim x As Integer
Dim y As Integer
Dim bln As Boolean
Dim dttable2 As New DataTable
For x = 0 To dttable.Columns.Count - 1
dttable2.Columns.Add(dttable.Columns(x).ColumnName)
Next
For x = 0 To dttable.Rows.Count - 1
For y = 0 To searchcolumns.Length - 1
If String.IsNullOrEmpty(searchcolumns(y)) = False Then
If searchcolumns(y) = CStr(dttable.Rows(x)(y + 1) & "") & "" Then
bln = True
Else
bln = False
Exit For
End If
End If
Next
If bln = True Then
dttable2.Rows.Add(dttable.Rows(x).ItemArray)
End If
Next
Return dttable2
End Function
answered Mar 28, 2015 at 10:39
2
To find a particular row, you might want to search by key which can uniquely identify each row.
But if you want to find a group of rows, then you want to use filter.
Key can contain different types of objects simultaneously. So can filter!
Following is a concrete example which covers searching with a key method or a filter method as locateOneRow() and locateRows() respectively.
using System.Data;
namespace namespace_A {
public static class cData {
public static DataTable srchTBL = new DataTable(tableName: "AnyTable");
public static DataColumn[] theColumns = {
new DataColumn("IDnum", typeof(int))
, new DataColumn("IDString", typeof(string))
, new DataColumn("DataString", typeof(string))
};
public static void DataInit(){
if (srchTBL.Columns.Count == 0) {
srchTBL.Columns.AddRange(theColumns);
srchTBL.PrimaryKey = new DataColumn[2] { srchTBL.Columns["IDnum"], srchTBL.Columns["IDstring"] };
//Data
srchTBL.Rows.Add(0, "me", "Homemaker");
srchTBL.Rows.Add(1, "me2", "Breadwinner2");
srchTBL.Rows.Add(1, "you", "Breadwinner1");
srchTBL.Rows.Add(2, "kid", "Learner");
}
}//DataInit
public static DataRow locateOneRow(){
DataInit();
object[] keyVals = new object[] {0, "me" };
return srchTBL.Rows.Find(keyVals);
}//locateOneRow - Result: the "Homemaker" row
public static DataRow[] locateRows(){ //no Primary key needed
DataInit();
return srchTBL.Select("IDnum = 1 OR IDstring = 'me'");
}//locateRows - Result: the row with "Homermaker" & the row with "Breadwinner2"
}//class
class Program {
static void Main(string[] args) {
try
{
DataRow row1 =cData.locateOneRow();
DataRow[] rows = cData.locateRows();
}catch(Exception ex){
}
} // Main
} // Program
}
- Remove From My Forums
-
Question
-
let suppose i have a DataTable1, i want to find out a record, how can i do, please write code.
thanks
Answers
-
hi,
if you searching for some rows that contain particular value like for example whom their age is = 30 you can use this
DataRow[] dr = table1.Rows.Find(“agecolumnName = 30”);
but if you want to search by id for example then you will get single value you can use something like this
DataRow dr = table1.Rows.Find(“idcolumnName = value”);
to read the value that stored in single row for example
string Name = dr(“nameColumnName”)
string age = dr(“ageColumnName”)
hope this helps
SVA 104 / 89 / 32 Регистрация: 12.07.2011 Сообщений: 622 |
||||||||
1 |
||||||||
.NET 3.x 06.03.2013, 12:51. Показов 9128. Ответов 2 Метки нет (Все метки)
Создал таблицу
Затем с помощью строк циклом записал данные в эту таблицу.
Теперь мне хотелось бы разобраться как в этой таблице найти строку например где поле MEM_ID = 5 и поменять этой строке значение поля CODE на 5555
0 |
Andrew2 14 / 14 / 3 Регистрация: 21.09.2012 Сообщений: 93 |
||||
06.03.2013, 13:30 |
2 |
|||
как то так
1 |
obrazer 73 / 73 / 3 Регистрация: 04.09.2012 Сообщений: 170 |
||||
06.03.2013, 13:37 |
3 |
|||
1 |
Упражнение 4. Поиск строки DataTable с помощью метода Find()
Объект DataTable – это находящееся в кэше памяти представление выбранных
из БД данных в табличной форме. Он может быть заполнен объединением одной или
нескольких таблиц из базы данных. Первоначальное заполнение DataTable выполняется
адаптером в соответствии с SQL-запросом. Но после первоначальной загрузки некоторые
столбцы могут быть добавлены в DataTable уже как результат вычислительных
действий над исходными столбцами в отсоединенном режиме.
Можно по исходным таблицам создавать новые виртуальные
таблицы, готовя их для отображения пользователю в соответствии с уровнем
бизнес-логики приложения. Эти таблицы можно наделять свойствами физических
таблиц, назначая им ключевые поля и устанавливая отношения между ними типа
главная-дочерняя.
Есть два пути выборки нескольких строк или поиска конкретной строки таблицы:
либо сформировать SQL–запрос к исходной таблице БД с заданным условием, либо
загрузить исходную таблицу в кэш и уже в нем выполнять требуемую выборку. Объект DataTable имеет
встроенные средства выборки нескольких строк из таблицы кэша с их сортировкой
или поиска конкретной строки. В последнем случае применяется метод Find(),
который работает только со столбцом, содержащим значения первичного ключа.
Поэтому перед вызовом метода Find() нужно либо загрузить схему, либо
вручную указать первичный ключ. Результатом выборки будет новая таблица, строка
или массив строк.
В данном упражнении мы будем работать с таблицей Customers, схема которой
показана на рисунке
SQL-командой мы полностью загрузим в кэш все столбцы таблицы Customers.
В отсоединенном
режиме по выбранному CustomerID будем
искать соответствующую запись и показывать пользователю значения
полей CustomerID, CompanyName, Adress, City, Region и Phone виртуальной
таблицы. Столбцы CustomerID и CompanyName динамически
свяжем с раскрывающимся списком ComboBox, причем столбец CompanyName сделаем
видимым. Значения полей найденной записи будем отображать в элементах TextBox,
недоступных для редактирования. Столбцу CustomerID присвоим статус первичного
ключа виртуальной таблицы.
-
Добавьте к решению
новый проект оконного приложения с именем WinForms4,
назначьте его стартовым и создайте пользовательский интерфейс в соответствии
с таблицей
Объект | Свойство | Значение | Пояснения |
---|---|---|---|
Form1 | Text | Упражнение 4 | Заголовок окна |
MaximizeBox | False | Отключили системную кнопку | |
FormBorderStyle | FixedSingle | Размеры окна менять нельзя | |
Label | Text | Customer: | |
ComboBox | (Name) | cbCustomers | |
DropDownStyle | DropDownList | Текст в поле списка редактировать нельзя | |
Label | Text | Customer ID: | |
TextBox | (Name) | txtCustomerID | |
Label | Text | Company Name: | |
TextBox | (Name) | txtCompanyName | |
Label | Text | Address: | |
TextBox | (Name) | txtAddress | |
Label | Text | City: | |
TextBox | (Name) | txtCity | |
Label | Text | Region: | |
TextBox | (Name) | txtRegion | |
Label | Text | Phone: | |
TextBox | (Name) | txtPhone | |
txtCustomerID, txtCompanyName, txtAddress, txtCity, txtRegion, txtPhone | BorderStyle | FixedSingle | Простая рамка вокруг текстового поля |
Форма на этапе проектирования должна выглядеть так
-
Защитите текстовые
поля от редактирования, для этого: выделите на форме
все элементы TextBox и в панели Properties в
режиме Events создайте для них общий обработчик события KeyPress,
затем общий обработчик события KeyDown. Обработчики заполните так
private void txtCustomerID_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; } private void txtCustomerID_KeyDown(object sender, KeyEventArgs e) { e.Handled = true; }
// Дополнительные пространства имен using System.Data.OleDb; using System.Data.Common; using System.Collections;
-
Добавьте в класс Form1 метод LoadCustomers(), который загружает таблицу Customers из
БД с помощью динамически созданного поставщика данных и SQL-запроса
// Строка соединения с абсолютным путем к БД, определяемым сборкой String ConnectionString(String fileName) { string JetEngineString = @"Provider=Microsoft.Jet.OLEDB.4.0;" + "Jet OLEDB:Engine Type=5;Data Source="; string pathToFile = Application.StartupPath.ToString() + "\Data\"; return JetEngineString + pathToFile + fileName.Trim() + ".mdb"; } DataTable tableCustomers; void LoadCustomers() { OleDbCommand selectCommand = new OleDbCommand(); selectCommand.CommandText="SELECT * FROM Customers"; selectCommand.Connection = new OleDbConnection(ConnectionString("Northwind")); selectCommand.CommandType = CommandType.Text; OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand); tableCustomers = new DataTable();// Создать таблицу try { // Заполнить таблицу adapter.Fill(tableCustomers); // Указать первичный ключ из одного столбца для использования метода Find() tableCustomers.PrimaryKey = new DataColumn[] { tableCustomers.Columns["CustomerID"] }; } catch (OleDbException exc) { tableCustomers = null; MessageBox.Show(exc.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { selectCommand.Connection.Close(); } // Связываем ComboBox с виртуальной таблицей cbCustomers.DataSource = tableCustomers; cbCustomers.DisplayMember = "CompanyName"; cbCustomers.ValueMember = "CustomerID"; }
-
Вставьте вызов метода LoadCustomers() в
конструктор класса Form1 проекта WinForms4
public Form1() { InitializeComponent(); LoadCustomers(); }
-
Выделите объект cbCustomers и
создайте для его события SelectedIndexChanged обработчик. Этот же
обработчик зарегистрируйте и для события BindingContextChanged объекта cbCustomers.
Заполните обработчик следующим кодом
private void cbCustomers_SelectedIndexChanged(object sender, EventArgs e) { if (tableCustomers == null) return; // При исключении выходить // Найти запись Object findValue = cbCustomers.SelectedValue;// Выделенное значение ValueMember DataRow row = tableCustomers.Rows.Find(findValue); // Заполнить текстовые поля if (row != null) { txtCustomerID.Text = row["CustomerID"].ToString(); txtCompanyName.Text = row["CompanyName"].ToString(); txtAddress.Text = row["Address"].ToString(); txtCity.Text = row["City"].ToString(); txtRegion.Text = row["Region"].ToString(); txtPhone.Text = row["Phone"].ToString(); } }
-
Запустите проект: список
заполняется сразу при запуске проекта, текстовые поля отображают подробности
при выборе заказчика и недоступны для редактирования, как и поле ComboBox
Поиск строки в виртуальной таблице DataTable выполняется методом Find() по
столбцу CustomerID, назначенному нами первичным ключем. Без этого метод работать
не будет. Критерий поиска берется из выбранного пользователем значения списка.
Задача решена.