Как найти строку в datatable c

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's user avatar

bluish

26k27 gold badges120 silver badges179 bronze badges

asked Mar 11, 2009 at 9:12

Dhanapal's user avatar

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 Rose's user avatar

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

Canavar's user avatar

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 Gravell's user avatar

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

user4723665's user avatar

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Создал таблицу

C#
1
2
3
4
5
6
7
8
9
 dT_NTV = new DataTable("ULD");
 
            DataColumn MEM_ID = new DataColumn("MEM_ID");
            MEM_ID.DataType = System.Type.GetType("System.String");
            this.dT_NTV.Columns.Add(MEM_ID);
 
            DataColumn CODE = new DataColumn("CODE");
            CODE.DataType = System.Type.GetType("System.String");
            this.dT_NTV.Columns.Add(CODE);

Затем с помощью строк циклом записал данные в эту таблицу.

C#
1
dR = dT_NTV.NewRow();

Теперь мне хотелось бы разобраться как в этой таблице найти строку например где поле MEM_ID = 5 и поменять этой строке значение поля CODE на 5555



0



Andrew2

14 / 14 / 3

Регистрация: 21.09.2012

Сообщений: 93

06.03.2013, 13:30

2

C#
1
2
3
4
5
foreach(DataRow row in dT_NTV.Rows)
{
  if(row[MEM_ID] == 5)
     row[CODE] = 5555;
}

как то так



1



obrazer

73 / 73 / 3

Регистрация: 04.09.2012

Сообщений: 170

06.03.2013, 13:37

3

C#
1
var row = dT_NTV.Select("MEM_ID = 5")[0];



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, назначенному нами первичным ключем. Без этого метод работать
не будет. Критерий поиска берется из выбранного пользователем значения списка.
Задача решена.

Добавить комментарий