Member 12863707 Ответов: 1

Отображаемые данные gridview не соответствуют выбору, выбранному из выпадающего списка


Я очень новичок в C#. Я пытаюсь создать веб-приложение, которое позволит пользователям видеть классы, основанные на предмете, который они выбирают из выпадающего списка. У меня есть выпадающий список, отображающий предметы из выпадающего списка. Код, который у меня есть, не показывает пользователю информацию, которую он выбрал из выпадающего списка. Он показывает одни и те же данные gridview, независимо от того, какой вариант выбран.

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

Это код, который покажет веб-приложение.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Summer.aspx.cs" Inherits="Summer" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Summer 2016</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <h1>Summer 2016</h1>
        <h2>Classes offered</h2>
        <h3>Please Choose a Subject</h3>
    </div>
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="Subjects" DataValueField="Subjects">
        
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:RegistrationConnectionString %>" SelectCommand="SELECT [Subjects], [Id] FROM [Subjects]">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="SqlDataSource2">
            <columns>
                <asp:BoundField DataField="Id" HeaderText="Id" ReadOnly="True" SortExpression="Id" />
                <asp:BoundField DataField="Instrutor" HeaderText="Instrutor" SortExpression="Instrutor" />
                <asp:BoundField DataField="CRN" HeaderText="CRN" SortExpression="CRN" />
                <asp:BoundField DataField="Credits" HeaderText="Credits" SortExpression="Credits" />
                <asp:BoundField DataField="Day" HeaderText="Day" SortExpression="Day" />
                <asp:BoundField DataField="Time" HeaderText="Time" SortExpression="Time" />
                <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                <asp:BoundField DataField="Section" HeaderText="Section" SortExpression="Section" />
                <asp:BoundField DataField="Location" HeaderText="Location" SortExpression="Location" />
                <asp:BoundField DataField="BeginEnd" HeaderText="BeginEnd" SortExpression="BeginEnd" />
                <asp:BoundField DataField="Number" HeaderText="Number" SortExpression="Number" />
                <asp:BoundField DataField="SubjectId_Fk" HeaderText="SubjectId_Fk" SortExpression="SubjectId_Fk" />
            
        
        <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:RegistrationConnectionString %>" SelectCommand="SELECT [Id], [Instrutor], [CRN], [Credits], [Day], [Time], [Title], [Section], [Location], [BeginEnd], [Number], [SubjectId_Fk] FROM [Classes]">
        <br>
    </form>
</body>
</html>

Это код, лежащий в основе приложения.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
public partial class Summer : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
           // DropDownList1.DataSource = GetDataTable();
            DropDownList1.DataValueField = "Id";
            DropDownList1.DataTextField = "Subjects";
            DropDownList1.DataBind();
        }
    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        using (SqlConnection Cn = new SqlConnection(ConfigurationManager.ConnectionStrings[@"C:\Users\Keith\Documents\Registration.mdf"].ConnectionString))
        {
            using (SqlCommand Cmd = new SqlCommand("select * from Classes where Id=" + DropDownList1.SelectedValue.ToString(), Cn))
            {
                Cn.Open();

                Cmd.Parameters.AddWithValue("@Id", int.Parse(DropDownList1.SelectedValue));
                SqlDataReader Dr = Cmd.ExecuteReader();
                if (Dr.HasRows)
                {
                    GridView1.DataSource = Dr;
                    GridView1.DataBind();
                }
                Dr.Close();

                Cn.Close();
            }

        }
    }
    public static DataTable GetDataTable(string sqlCommand)
    {
        DataTable table = new DataTable();
        try
        {
            using (SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[@"C:\Users\Keith\Documents\Registration.mdf"].ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand(sqlCommand, myConnection))
                {
                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                    {
                        adapter.Fill(table);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            table = null;
            throw ex;
        }
        return table;
    }
}

Er. Puneet Goel

Так в чем же, собственно, ваша проблема ? Ошибка нулевой ссылки или как привязать представление сетки к выпадающему списку изменения выбранного значения ?

Member 12863707

Я бы сказал, что обе эти проблемы - моя проблема, но я думаю, что если ошибка NullReferenceException исчезнет с изменением кода.

haisol

Обычно я использовал sql-команду query type хранимых процедур и добавлял к ней параметры (а не тип запроса текста). Я бы изменил ваш запрос на хранимую процедуру, установил тип команды на процедуру и использовал cmd.Parameters.AddWithValue. Еще одним более быстрым вариантом было бы изменить ваш запрос на следующий: select * from ODetails where orderID= " + DropDownList1.SelectedValue.ToString () (псевдокод).

Member 12863707

Я обновил код с вашим предложением. Я получаю исключение NullReferenceException на моих вторых связях.

Er. Puneet Goel

вы имеете в виду в GetDataTable?

1 Ответов

Рейтинг:
1

haisol

Не думайте, что вам нужен Cn.Open() в функции GetData. Это работает для меня:

public static DataTable GetDataTable(string sqlCommand)
{
    DataTable table = new DataTable();
    try
    {
        using (SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings[@"C:\Users\Keith\Documents\Registration.mdf"].ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand(sqlCommand, myConnection))
            {
                using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                {
                    adapter.Fill(table);
                }
            }
        }
    }
    catch (Exception ex)
    {
        table = null;
        throw ex;
    }
    return table;
}


Member 12863707

Значит, это заменит функцию GetData ()?

Member 12863707

Я также получаю ошибку, когда делаю это, говоря, что "myConnection" не существует в этом контексте.

haisol

Слишком много близких скобок. Попробуйте скопировать и вставить еще раз.