Генерация элементов раскрывающегося списка из кода с использованием C#

я пытаюсь создать раскрывающийся список из кода позади, но я получаю эту ошибку:

Object reference not set to an instance of an object.
Line 101:        ddlGroupName1.DataSource = cmd.ExecuteReader();

может кто-нибудь помочь? вот мой код aspx:

 <asp:DropDownList ID="ddlGroupName1" runat="server" OnSelectedIndexChanged="GroupNameChanged1"
                                        AutoPostBack="true" AppendDataBoundItems="true">
                                        <asp:ListItem Text="ALL" Value="ALL"></asp:ListItem>
                                        <asp:ListItem Text="Top 10" Value="10"></asp:ListItem>
                                    </asp:DropDownList>

вот мой код позади

 private void GetGroupNameList(DropDownList ddlGroupName1)
    {
        DataSet dataSet = new DataSet();
        String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
        SqlConnection con = new SqlConnection(strConnString);

        SqlCommand cmd = new SqlCommand("select distinct GroupName" +
                        " from MyTable");
        cmd.Connection = con;
        con.Open();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dataSet);

        ddlGroupName1.DataSource = dataSet.Tables[0];

        ddlGroupName1.DataBind();
        con.Close();
        ddlGroupName1.Items.FindByValue(ViewState["MyFilter"].ToString())
                .Selected = true;
    }

person moe    schedule 29.03.2013    source источник
comment
В сообщении об ошибке говорится, что один из объектов (ddlGroupName1 или cmd) имеет значение null. И поскольку вы использовали cmd раньше, я думаю, что ddlGroupName1 не установлен, когда вы выполняете метод GetGroupNameList.   -  person Jan    schedule 29.03.2013


Ответы (2)


ExecuteReader возвращает средство чтения данных, которое требует повторения каждой строки. У вас есть несколько вариантов. Либо повторите считыватель данных с помощью:

    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        // Add your values to a List of entities or DataTable, then bind to that
    }

Или используйте SqlDataAdapter, чтобы вывести его непосредственно в DataSet/DataTable и привязать к нему.

Вот так:

DataSet dataSet = new DataSet();
String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(strConnString))
{
   using (SqlCommand cmd = new SqlCommand("select distinct GroupName" +
                    " from MyTable"))
   {
       cmd.Connection = con;

       SqlDataAdapter da = new SqlDataAdapter(cmd);
       da.Fill(dataSet);

       ddlGroupName1.DataSource = dataSet.Tables[0];
       ddlGroupName1.DataBind();
   }
}
person Adam Plocher    schedule 29.03.2013
comment
Извиняюсь! Это должно было быть dataSet.Tables[0]. Только что обновил свой ответ. - person Adam Plocher; 29.03.2013
comment
по-прежнему не работает в этой строке: ddlGroupName1.DataSource = dataSet.Tables[0];. Я обновил свой код в соответствии с вашим предложением, пожалуйста. см. выше. Благодарность - person moe; 29.03.2013
comment
Взгляните на мою правку. Вам не нужно вызывать Command.Open() или Close(). DataAdapter будет обрабатывать открытие соединения. Если это все еще не удается, какую ошибку вы получаете? Операторы using не являются обязательными, но обычно рекомендуются. Они просто вызывают вызов метода Dispose() в конце использования. - person Adam Plocher; 29.03.2013

Я не думаю, что вы можете использовать .datasource = sqldatareader(). Вам нужно загрузить данные в datatable и сделать .datasource = _dtDataTable. sqldatareader() - это чтение строки в режиме реального времени по одной.

person iefpw    schedule 29.03.2013