Member 13614228 Ответов: 2

Поиск в таблице данных C#


У меня есть экран просмотра сетки результатов. Источником которого является datatable.

Таблицу запрос = выберите project_type ,tc_id,details,dom,planned_execution_start_date,planned_execution_end_date,actual_execution_start_date,actual_execution_end_date,test_prime,status,'просмотреть подробности как view_details, 'история' как view_history от project_details;

Теперь мне нужно искать сетку с помощью project_type,tc_id,test_prime

Как это сделать?

Что я уже пробовал:

protected void btnSubmit_Click(object sender, EventArgs e)
       {
           string searchText;
           searchText = txtbxSearch.Text;
           bindSearchData(searchText);
       }

       protected void bindSearchData(string searchText)
       {

           System.Data.DataTable dt = providers.GetDataTable("select project_type ,tc_id,details,dom,planned_execution_start_date,planned_execution_end_date,actual_execution_start_date,actual_execution_end_date,test_prime,status,'View Details' as view_details, 'View History' as view_history from project_details", "VTAS");

           if (searchText != null)
           {

               //DataView dv = new DataView(dt);
               //dv.RowFilter = "project_type in ('"+searchText+"')"  ;

               //dv.RowFilter = "test_prime in ('"+searchText+"')";
               //dv.RowFilter = "tc_id in ('" + searchText + "')";
               //Grid1.DataSource = dv;
               //Grid1.DataBind();
               //DataRow[] Result = dt.Select("project_type in ('" + searchText + "') or test_prime  in ('" + searchText + "') or tc_id  in ('" + searchText + "')");
               DataRow[] Result = dt.Select("project_type in ('" + searchText + "') or  tc_id  in ('" + searchText + "')");
               Grid1.DataSource = Result;
               Grid1.DataBind();

           }
           else
           {
               Grid1.DataSource = dt;
               Grid1.DataBind();
           }
       }

2 Ответов

Рейтинг:
2

Maciej Los

Ну, а filterExpression параметр из объект DataTable.метод Select[^] создает объект DataColumn.Выражение[^].
Существует список применимых функций, операторов, которые можно использовать для определения выражения. IN он также доступен, и вы должны передавать значения в виде строки, разделенной запятыми. Взгляните на пример:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("project_type", typeof(int)));
dt.Columns.Add(new DataColumn("tc_id", typeof(int)));

Random r = new Random();
dt = Enumerable.Range(1, 50)
	.Select(x=> dt.LoadDataRow(new object[]{r.Next(x)+1,r.Next(x+1)+1}, false))
	.CopyToDataTable();
//filter criteria:
string tcs = "1,2,3";
string pts = "5,8,10";
var filtered = dt.Select(string.Format("project_type IN({0}) OR tc_id IN({1})", pts, tcs));


Например, приведенный выше код возвращает:
project_type tc_id
1            1 
2            2 
3            2 
3            2 
3            3 
4            2 
4            2 
5            1 
5            2 
5            16 
6            3 
8            9 
8            21 
10           15 
10           18 
10           34 
15           1 
26           2


Способ заполнения Таблицы данных не имеет значения, но - как вы можете видеть - filterExpression работать отлично ;)

Существует по крайней мере несколько способов фильтрации данных:
1. На сервере (базы данных) (через SQL-запрос), - настоятельно рекомендуется!
2. на уровне клиента, через filetering datatable, представления и т.д., Используя:
- Выражения столбцов данных (Select метод)
- LINQ to DataSet | Microsoft Docs[^]

Удачи вам!


Рейтинг:
2

RickZeeland

Вы уже нашли его объект DataTable.Выбрать() и что стандартный синтаксис SQL не всегда работает с этой функцией.
Проблема, по-видимому, в том, что В предложение, вот пример, который использует пользовательскую функцию IN, которая может работать так, как вы ожидаете: В предложении in datatable.выбирать[^]


Maciej Los

OP использует метод Select ;)

RickZeeland

Спасибо, вы правы, как обычно, обновили мой ответ !

Maciej Los

Лучше... Я согласен с этим утверждением: Проблема, по-видимому, заключается в предложении [IN] Я попытался объяснить, как создать filerExpression с помощью оператора [IN]. Пожалуйста, смотрите мой ответ.

Member 13614228

Я получаю несколько разных исключений.. Прилагаемый скриншот для исключения

RickZeeland

Боюсь, что вы можете прикреплять скриншоты только в статьях, а не в вопросах, к сожалению, но, возможно, вы можете использовать DropBox, OneDrive или что-то в этом роде ...