Я привязываю DataTable к DGV с помощью этого метода:
public DataTable GetDgvData(string selectQuery, string companyFilter, string categoryFilter, string idFilter)
{
using (NpgsqlConnection conn = new NpgsqlConnection(connString))
using (NpgsqlCommand cmd = new NpgsqlCommand(selectQuery, conn))
{
cmd.Parameters.Add(new NpgsqlParameter("company", companyFilter));
if (!string.IsNullOrEmpty(idFilter)) cmd.Parameters.Add(new NpgsqlParameter("idList", idFilter));
if (categoryFilter != "All Categories") cmd.Parameters.Add(new NpgsqlParameter("category", categoryFilter));
DataSet ds = new DataSet();
conn.Open();
using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd))
{
da.Fill(ds);
}
conn.Close();
return ds.Tables[0];
}
}
Изначально у него не было последнего параметра, string idFilter
или второго cmd.Parameters.Add() line
. И все вызовы метода работали нормально и заполняли DGV, использующие этот метод.
Затем я добавил функцию поиска в мою WinForm, которая ищет в DataTable таблицы DGV введенную пользователем строку, перебирает DataTable, создает список идентификаторов записей для строк с искомой строкой, а затем мне нужно перестроить DGV, используя только строки со строкой поиска в ячейке в DataTable.
Вот функция для этого процесса поиска:
private void btnSearch_Click(object sender, EventArgs e)
{
string searchText = txtSearchCatsGrid.Text;
string idToAddToList = "";
string tempIdList = "";
string idListForQuery = "";
DataTable dt = ((DataTable)dgvCategories.DataSource);
string cellValue;
int rowIndex;
int columnIndex;
for (rowIndex = 0; rowIndex <= dt.Rows.Count - 1; rowIndex++)
{
for (columnIndex = 0; columnIndex <= dt.Columns.Count - 1; columnIndex++)
{
cellValue = dt.Rows[rowIndex][columnIndex].ToString();
if (searchText == cellValue)
{
// Set corresponding dgvCategories cell's background color to yellow
dgvCategories[columnIndex, rowIndex].Style.BackColor = Color.Yellow;
idToAddToList = dt.Rows[rowIndex][0].ToString();
}
}
if (!string.IsNullOrEmpty(idToAddToList) && !tempIdList.Contains(idToAddToList)) tempIdList += idToAddToList + ",";
}
if (!string.IsNullOrEmpty(tempIdList))
{
idListForQuery = tempIdList.Remove(tempIdList.Length - 1, 1);
}
Console.WriteLine("idListForQuery: " + idListForQuery);
// Refresh dgvCategories with just rows from search, using idListForQuery
string companyFilter = cboSelectCompany.Text;
string categoryFilter = cboSelectCategory.Text;
db categoriesData = new db();
if (categoryFilter == "All Categories")
{
string catsQuery = "SELECT id, category, source_company, old_value, old_desc, new_value, new_desc, reference1, reference2 " +
"FROM masterfiles.xref"+
" WHERE company_name = @company" +
" AND id IN (@idList)" +
" ORDER BY category, old_value, source_company";
this.dtCategories = categoriesData.GetDgvData(catsQuery, companyFilter, categoryFilter, idListForQuery);
}
else
{
string catsQuery = "SELECT id, category, source_company, old_value, old_desc, new_value, new_desc, reference1, reference2 " +
"FROM masterfiles.xref" +
" WHERE company_name = @company" +
" AND category = @category" +
" AND id IN (@idList)" +
" ORDER BY old_value, source_company";
this.dtCategories = categoriesData.GetDgvData(catsQuery, companyFilter, categoryFilter, idListForQuery);
}
// TODO: Need to check this.dtCategories.Rows.Count
dgvCategories.DataSource = this.dtCategories;
if (dtCategories.Rows.Count == 0)
{
return;
}
else
{
dgvCategories.Columns[0].Visible = false;
dgvCategories.Rows[0].Cells[0].Selected = false;
}
}
Список идентификаторов, переданных в функцию GetDgvData()
, является правильным, и, насколько я могу судить, реализуется точно так же, как фильтры компании и категории. Программа работает нормально, когда форма загружается и DGV изначально заполняется (я передаю пустую строку в GetDgvData()
для всех других вызовов к ней), но когда я использую эту функцию поиска, я получаю ошибку в da.Fill(ds)
«Npg sql .PostgresException: 42883: оператор не существует: целое число = текст».
«selectQuery» выглядит так:
SELECT id, category, source_company, old_value, old_desc, new_value, new_desc, reference1, reference2 FROM masterfiles.xref WHERE company_name = @company AND id IN (@idList) ORDER BY category, old_value, source_company
и idList выглядит следующим образом:
1475,1476,1477,1331,1332
Я интерпретирую исключение, чтобы обозначить, что идентификаторы должны быть целыми числами, но я не могу понять, как передать этот список идентификаторов методу GetDgvData()
как целые числа - если это вообще проблема здесь. Нужно ли создавать список идентификаторов в виде массива и таким образом передавать список в GetDgvData()
? Или в GetDgvData()
приведите каждый из этих идентификаторов как int?