S_ledge Ответов: 2

Поисковый запрос в текстовом поле показывает только пустые строки в datagridview.


РИСУНОК НИЖЕ.

Загруженные Данные
public void LoadData()    
		{
			SqlConnection con = new SqlConnection("Data Source=GH0ST;Initial Catalog=InventoryProjectDB;Integrated Security=True");
			SqlDataAdapter sda = new SqlDataAdapter(@"SELECT * FROM [dbo].[PRODUCT]", con);
			DataTable dt = new DataTable();
			sda.Fill(dt);
			dataGridView1.Rows.Clear();
			foreach (DataRow item in dt.Rows)
			{
				int ar = dataGridView1.Rows.Add();
				dataGridView1.Rows[ar].Cells[0].Value = item["PID"].ToString();
				dataGridView1.Rows[ar].Cells[1].Value = item["PName"].ToString();
				dataGridView1.Rows[ar].Cells[2].Value = item["PPrice"].ToString();
				if ((bool)item["PStatus"])
				{
					dataGridView1.Rows[ar].Cells[3].Value = "In Stock";
				}
				else
				{
					dataGridView1.Rows[ar].Cells[3].Value = "Out of Stock";
				}
				dataGridView1.Rows[ar].Cells[4].Value = item["PQTY"].ToString();
				dataGridView1.Rows[ar].Cells[5].Value = item["PDateAdded"].ToString();
			}
		}

		private void MAIN_Load(object sender, EventArgs e)
		{
			
			DateTimePicker1.Value = DateTime.Now;
			cbx_Status.SelectedIndex = 0;
			LoadData();

		}


Код TextChanged
private void bx_Search_TextChanged(object sender, EventArgs e)
		{
			SqlConnection con = new SqlConnection("Data Source=GH0ST;Initial Catalog=InventoryProjectDB;Integrated Security=True");
			con.Open();
			SqlDataAdapter sda = new SqlDataAdapter(@"SELECT * FROM [dbo].[PRODUCT] WHERE PNAME LIKE '%" + bx_Search.Text + "%' ", con);
			DataTable dt = new DataTable();
			sda.Fill(dt);
			dataGridView1.DataSource = dt;
			con.Close();
}


Перед запросом:
[IMG01]
После запроса:
[IMG02]

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

Я застрял, и мне действительно нужно закончить этот проект.

2 Ответов

Рейтинг:
1

RickZeeland

Иногда это помогает установить .DataSource к Null первый:

dataGridView1.DataSource = null;
Также смотрите пример здесь: Фильтрация DatGridView Пользовательский Контроль[^]


Рейтинг:
0

Maciej Los

Несколько советов:

1.
Взгляните на это LoadData и дальше bx_Search_TextChanged рутина. В обоих случаях вы создаете соединение, команду и т. д.
Главное правило программирования-это: если фрагмент кода используется дважды (или более) - измените его на подпрограмму!

2.
Никогда не используйте объединенную строку в качестве запроса! Это распространенная причина того, что SQL-инъекция[^]. Лучший способ-это использовать параметризованный запрос[^].

3.
Используйте вычисляемый столбец DataTable, чтобы получить результат сравнения "PStatus" с true/false.

Наконец, ваш

public void LoadData(string search="*")    
{
    SqlConnection con = new SqlConnection("Data Source=GH0ST;Initial Catalog=InventoryProjectDB;Integrated Security=True");
    string sql = "SELECT * FROM [dbo].[PRODUCT]";
    if(search!=string.Empty && search!="*") sql = string.Format("{0} WHERE PName Like '%{1}%'", sql, search);
    SqlDataAdapter sda = new SqlDataAdapter(sql, con);
    DataTable dt = new DataTable();
    sda.Fill(dt);
    //add expression column!
    DataColumn expressionColumn = new DataColumn("Stock", typeof(string), "IIf(PStatus=true,'In Stock','Out of Stock')");
    dt.Columns.Add(expressionColumn);
    expressionColumn.SetOrdinal(4);
    dataGridView1.DataSource = dt;
    }
}

private void bx_Search_TextChanged(object sender, EventArgs e)
{
    LoadData(bx_Search.Text)
}



Для получения более подробной информации, пожалуйста, смотрите:
Создание Столбцов Выражений | Microsoft Docs[^]
объект DataColumn.свойство expression [^]