使用c#在asp.net的sqlserver中显示dropdownlist中的数据

时间:2013-10-05 13:09:42

标签: c# asp.net

我有三个下拉列表,下面是代码

  <asp:DropDownList ID="ForumTitleList" runat="server"

                        AutoPostBack="True">
                    </asp:DropDownList>
                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    <asp:DropDownList ID="ForumSubTitleList" runat="server" AutoPostBack="True"
                        >
                    </asp:DropDownList>
                    &nbsp;&nbsp;&nbsp;
                    <asp:DropDownList ID="ForumSubjectTitleList" runat="server" AutoPostBack="True"
                       >
                    </asp:DropDownList>

,背后的代码是

enter code here 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Net;
using System.Net.Mail;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text.RegularExpressions;

namespace Auzine.Forums
{
    public partial class ForumIT : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)

    {
        ConfigurationFuntion();

        DropForumTitle();
        DropForumSubTitle();
        DropForumSubjectTitle();
    }


protected void DropForumTitle()
{
    if (!Page.IsPostBack)
    {

        string connection = System.Configuration.ConfigurationManager.ConnectionStrings["AuzineConnection"].ConnectionString;

        string selectSQL = "select DISTINCT ForumTitlesID,ForumTitles from ForumTtitle";
        SqlConnection con = new SqlConnection(connection);
        SqlCommand cmd = new SqlCommand(selectSQL, con);
        SqlDataReader reader;
        try
        {

            ListItem newItem = new ListItem();
            newItem.Text = "Select";
            newItem.Value = "0";
            ForumTitleList.Items.Add(newItem);
            con.Open();
            reader = cmd.ExecuteReader();



            while (reader.Read())
            {
                ListItem newItem1 = new ListItem();
                newItem1.Text = reader["ForumTitles"].ToString();
                newItem1.Value = reader["ForumTitlesID"].ToString();
                ForumTitleList.Items.Add(newItem1);



            }
            reader.Close();
            reader.Dispose();
            con.Close();
            con.Dispose();
            cmd.Dispose();


        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        //////////////////

    }
}
protected void DropForumSubjectTitle()
{
    if (Page.IsPostBack)
    {
       // ForumSubjectTitleList.Items.Clear();
        string connection = System.Configuration.ConfigurationManager.ConnectionStrings["AuzineConnection"].ConnectionString;
        SqlConnection con = new SqlConnection(connection);

        con.Open();



        SqlCommand com = new SqlCommand("select DISTINCT ForumSubjectTitle from ForumSubject where ForumSubTitlesID='" + ForumSubTitleList.SelectedValue.ToString() + "'", con);
        SqlDataReader reader = com.ExecuteReader();
        // ForumTitleList.Items.Clear();

        while (reader.Read())
        {
            ForumSubjectTitleList.Items.Add(reader[0].ToString());


        }

        reader.Close();
        con.Close();



    }

}

protected void DropForumSubTitle()
{


    if (Page.IsPostBack)
    {
        ForumSubTitleList.Items.Clear();
        string connection = System.Configuration.ConfigurationManager.ConnectionStrings["AuzineConnection"].ConnectionString;
        string selectSQL = "select DISTINCT ForumTitlesID,ForumSubTitles from ForumSubtitle where ForumTitlesID='" + ForumTitleList.SelectedValue.ToString() + "' ";
         SqlConnection con = new SqlConnection(connection);
        SqlCommand cmd = new SqlCommand(selectSQL, con);
        SqlDataReader reader;
        try
        {

            ListItem newItem = new ListItem();
            newItem.Text = "Select";
            newItem.Value = "0";
            ForumSubTitleList.Items.Add(newItem);
            con.Open();
            reader = cmd.ExecuteReader();



            while (reader.Read())
            {
                ListItem newItem1 = new ListItem();
                newItem1.Text = reader["ForumSubTitles"].ToString();
                newItem1.Value = reader["ForumTitlesID"].ToString();
                ForumSubTitleList.Items.Add(newItem1);



            }
            reader.Close();
            reader.Dispose();
            con.Close();
            con.Dispose();
            cmd.Dispose();


        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        //////////////////

    }
    }
}
dropdown1(ForumTitleList)列表的DropForumTitle()工作正常然后用于dropdown2(ForumSubTitleList)我想根据所选的dropdown1(ForumTitleList)值进行搜索,当我为dropdown1编写代码时(ForumTitleList) )然后它没有显示任何东西,但是当将代码从if(!Page.IsPostBack)更改为if(Page.IsPostBack)然后它显示但是所选索引以非自动方式转到0 ...它显示正确但是当选择任何选项时从dropdown2(ForumSubTitleList)然后它通过默认转到选定索引0并且对于此错误,dropdown3(ForumSubjectTitleList)可以接收所选项目值并且不显示来自数据库的主题列表...如果下拉列表显示,则每个下拉列表都与ID连接任何事情然后第二次下拉=选择下拉列表1的值和下拉列表3 =相同的下拉列表2的值

但是我收到了dropdown2和dropdown3的错误

简而言之:

1-dropdown2不会保持我选择的值:让我们假设在LI A,b,C和D.当我点击A它后面时,所选的值再次是A;

2- dropdown3无法访问dropdown2的选定值,因此它没有显示任何内容......

3 个答案:

答案 0 :(得分:1)

在每个回发中,你都会在每个下拉列表中做两件事:

  1. 使用数据重新填充
  2. 填充下一个
  3. 第一步就是摆脱你选择的价值。清除值并添加新值时,它无法保留所选值。

    您需要将这些操作分开。首先,我们假设你有DropDownList1,其选择应该是DropDownList2。然后Page_Load应该只填充DropDownList1,并且只有当它不是回复时才填充protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) PopulateDropDownList1(); } 。像这样:

    DropDownList2

    要填充SelectedIndexChanged,您需要回复DropDownList1 protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { var value = DropDownList1.SelectedValue; PopulateDropDownList2(value); } 事件。像这样:

    Page_Load

    请注意,SelectedIndexChanged会在每次加载页面时调用,甚至是回发,并且在事件之前称为,如{{1} }。因此,如果您在Page_Load中重新填充父列表,则SelectedIndexChanged中将不再显示所选值。

    根据上述情况,事件的顺序为:

    1. 用户加载页面。
    2. Page_Load执行。
    3. 这不是回复,因此DropDownList1会填充值。
    4. 用户在DropDownList1中选择一个值并触发回发。
    5. Page_Load执行。
    6. 是一个回发帖,所以Page_Load没有做任何事情。
    7. DropDownList1_SelectedIndexChanged执行。
    8. DropDownList2会填充值。
    9. 此时,用户现在可以查看他们在DropDownList1中选择的内容以及DropDownList2中的新值。将其扩展到第三个DropDownList是相同的模式。您创建的DropDownList2_SelectedIndexChangedDropDownList1_SelectedIndexChanged的功能相同,但使用下一个级联列表。

答案 1 :(得分:0)

填充示例代码:

方法

private void Bind()
{

    var dt = YourFunctionReturningDataTable(); 
    //Assuming your table has two columns Id,Name

    dropdownlist1.datasource = dt;
    dropdownlist1.DataTextField = "Name";
    dropdownlist1.DataValueField="Id";
    dropdownlist1.DataBind();
    dropdownlist1.Items.Insert(0, new ListItem("---Select---","-1"));
}

private void Page_Load()
{


  if(!IsPostback)
  {
  Bind();   
  }
}

答案 2 :(得分:0)

我认为这是在下拉列表中显示所有类型名称的最佳方式。我使用EDMX和LINQ查询。

 ASPX:
===============
<asp:DropDownList ID="GenreList" runat="server" SelectMethod="GenreList_GetData" DataTextField="Name" DataValueField="Id">
    </asp:DropDownList>

    C#:
    ============
     public IEnumerable<Genre> GenreList_GetData()
        {
            using(PlanetWroxEntities myEntities= new PlanetWroxEntities())
            {
                return (from genre in myEntities.Genres
                        orderby genre.SortOrder
                        select genre).ToList();
            }
        }