#c# #asp.net #gridview #webforms #drop-down-menu
#c# #asp.net #gridview #веб-формы #выпадающее меню
Вопрос:
Я перепробовал все, но не могу понять, как заполнить gridview моим выпадающим списком. Я проверил значение выпадающего списка, и оно правильное, и в gridview будут отображаться все элементы, но не те, которые я хочу. Я использую веб-форму. Ниже приведен мой код.
protected void Page_Load(object sender, EventArgs e)
{
Populate();
}
protected void btnDisplay_Click(object sender, EventArgs e)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
myConnection.Open();
try
{
SqlDataReader reader = null;
string serverIP = drpChoose.SelectedItem.Value.ToString();
SqlCommand cmd = new SqlCommand("SELECT * from ScheduledTasks WHERE ServerIP = " serverIP, myConnection);
reader = cmd.ExecuteReader();
while (reader.Read())
{
GridView1.DataSource = reader;
GridView1.DataBind();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
myConnection.Close();
}
public void Populate()
{
SqlConnection myConnection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
myConnection1.Open();
SqlCommand cmd1 = new SqlCommand("SELECT ServerIP FROM Servers", myConnection1);
SqlDataReader dropReader;
dropReader = cmd1.ExecuteReader();
drpChoose.DataSource = dropReader;
drpChoose.DataTextField = "ServerIP";
drpChoose.DataValueField = "ServerIP";
drpChoose.DataBind();
}
}
Любая помощь была бы высоко оценена.
Комментарии:
1. Используйте хранимые процедуры, если вы используете SQL Server, с фактическими параметрами, связанными с объектом SqlCommand.
2. Я добился этого, создав параметр для serverIP, а затем установив его в свою переменную serverIP. Спасибо всем.
Ответ №1:
Вам также следует применить параметризацию sql. Это поможет предотвратить атаки с использованием SQL-инъекций. К которому в настоящее время уязвим ваш код.
Ответ №2:
Вам не нужно повторно привязывать выпадающий список после каждой записи, иначе вы потеряете выбранный элемент. Попробуйте следующее:
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{
Populate();
}
}
protected void btnDisplay_Click(object sender, EventArgs e)
{
SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
myConnection.Open();
try
{
SqlDataReader reader = null;
string serverIP = drpChoose.SelectedItem.Value.ToString();
SqlCommand cmd = new SqlCommand("SELECT * from ScheduledTasks WHERE ServerIP = " serverIP, myConnection);
reader = cmd.ExecuteReader();
while (reader.Read())
{
GridView1.DataSource = reader;
GridView1.DataBind();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
myConnection.Close();
}
public void Populate()
{
SqlConnection myConnection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ConnectionString);
myConnection1.Open();
SqlCommand cmd1 = new SqlCommand("SELECT ServerIP FROM Servers", myConnection1);
SqlDataReader dropReader;
dropReader = cmd1.ExecuteReader();
drpChoose.DataSource = dropReader;
drpChoose.DataTextField = "ServerIP";
drpChoose.DataValueField = "ServerIP";
drpChoose.DataBind();
}
}
Комментарии:
1. Это все еще не сработало. Моя сетка не отображается. Однако, когда я меняю свою SQL-команду на SELECT * FROM TABLE без указания WHERE, она работает нормально.
Ответ №3:
Просто руководство: почему бы не использовать элемент управления Ajaxtoolkit UpdatePanel. Поместите Gridview в панель обновления, затем установите выпадающий список в качестве Updatetrigger для Gridview.Тогда вам не придется беспокоиться об обратной передаче и значениях.
Ответ №4:
Измените свой метод Page_Load на:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack()) {
Populate();
}
}
При каждой загрузке страницы вы повторно привязываете выпадающий список, чтобы всегда было установлено значение по умолчанию «все». С помощью страницы.Это свойство POSTBACK, вы указываете странице привязываться только при первой загрузке, а не при последующих отправках. С помощью этого свойства выбранный элемент в выпадающем списке не будет меняться при обратной передаче.
MSDN: Страница.IsPostBack
Обновить
Что касается вашего комментария по поводу предложения «Where» в вашем SQL-операторе, хранится ли serverIP в базе данных в виде текста? Попробуйте обернуть serverIP в апострофы, такие как:
SqlCommand cmd = new SqlCommand("SELECT * from ScheduledTasks WHERE ServerIP = '" serverIP "'', myConnection);
Комментарии:
1. Я получаю serverIP из выпадающего списка, который заполняется из SQL. строка serverIP = drpChoose. Выбранный элемент. Значение. toString(); Я проверил значение serverIP, и, похоже, оно работает.
2. Да, но как serverIP хранится в SQL Server? Каков его тип данных?
3. Я заставил это работать, создав параметр. Да, он сохраняется в виде текста.