C # Заполнить Gridview из выпадающего списка

#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-инъекций. К которому в настоящее время уязвим ваш код.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

Ответ №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. Я заставил это работать, создав параметр. Да, он сохраняется в виде текста.