黑马程序员技术交流社区

标题: 选择第一个ComboBox(省)时,弹不出第第二个ComboBox中的可选 [打印本页]

作者: 9881008杜鹏    时间: 2011-11-15 00:43
标题: 选择第一个ComboBox(省)时,弹不出第第二个ComboBox中的可选
namespace 全国省市
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS;AttachDBFilename = |DataDirectory|\Database1.mdf;Integrated Security= true ;User Instance=true"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from promary";
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        Promary item = new Promary();
                       //comboBox1.DisplayMember=Name;
                        while (reader.Read())
                        {

                           
                            item.ID = reader.GetInt32 ((reader.GetOrdinal("proID")));
                            item.Name = reader.GetString(reader.GetOrdinal("proName"));
                            comboBox1.Items.Add (item);
                        }

                    }
                }
            }


        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBox2.Items.Clear();
            Promary item = (Promary)comboBox1.SelectedItem;
            int proID = item.ID ;
            using (SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS;AttachDBFilename = |DataDirectory|\Database1.mdf;Integrated Security= true ;User Instance=true"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    //cmd.CommandText = "select * from city";
                    //int proId = item.ID ;
                  cmd.CommandText = "select * from city where proID=@proID";
                   cmd.Parameters.Add(new SqlParameter("proID", proID));
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            string CityName = reader.GetString(reader.GetOrdinal ("cityName"));
                            comboBox2.Items.Add(CityName);
                           
                        }
                        
                        
                    }
                }
            }

        }
    }
        class Promary
        {
            public string Name { get; set; }

            public int ID { get; set; }

        }
      
    }


作者: 李荣壮    时间: 2011-11-15 08:12
if (reader.Read())   // 你用if ? 那不是只读取第一条数据
{
      string CityName = reader.GetString(reader.GetOrdinal ("cityName"));
      comboBox2.Items.Add(CityName);
}
作者: 宋天琪    时间: 2011-11-15 08:49
  if (reader.Read())
这里有错误,if改成while。
作者: 朱勋    时间: 2011-11-15 09:17
楼上均正解,但是应该出来一条记录是不?
作者: 朱勋    时间: 2011-11-15 09:24
楼上均正解,但是应该出来一条记录是不?
作者: 张振鹏    时间: 2011-11-15 09:25
if (reader.Read())
不应用if读取,应用while循环
Promary item = (Promary)comboBox1.SelectedItem;  这行代码无法将类型为“System.String”的对象强制转换为类型“全国省市.Promary”。
作者: 吴春晟    时间: 2011-11-15 13:04
你要出来一条记录 ,那要在
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
事件中指定 cmobobox2.selectedIndex=0;//给一个指定选 中项
作者: 9881008杜鹏    时间: 2011-11-16 15:33
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace 省市的选择
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

      

        private void Form1_Load(object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS;AttachDBFilename = |DataDirectory|\Database1.mdf;Integrated Security= true ;User Instance=true"))   //该处用 using()的目的是释放内存,以下也一样
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from promary";
                    using (SqlDataReader  reader = cmd.ExecuteReader())
                    {
                        //Readpromary items = new Readpromary();//在该处声明读取到的proID时最后一个字段(在本数据库中时35)
                        
                        while (reader.Read())
                        {
                            Readpromary items = new Readpromary();
                            items.Id = reader.GetInt32(reader.GetOrdinal ("proID"));
                            items.Name = reader.GetString(reader.GetOrdinal ("proName"));
                            cmb_sheng.Items.Add(items);
                        }
                    }
                }
            }

        }

      

        private void cmb_sheng_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            Readpromary items = (Readpromary)cmb_sheng.SelectedItem;//指针只认变量类型不认实际对象,所以要进行类型转换
            int proID = items.Id;
            using (SqlConnection conn = new SqlConnection(@"Data Source =.\SQLEXPRESS;AttachDBFilename = |DataDirectory|\Database1.mdf;Integrated Security= true ;User Instance=true"))   //该处用 using()的目的是释放内存,以下也一样
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from city where proID = @ProID";
                    cmd.Parameters.Add(new SqlParameter("ProID", proID));
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        //Readpromary cityItem = new Readpromary();
                        while (reader.Read())
                        {
                            // cityItem.Name = reader.GetString(reader .GetOrdinal ("cityName"));
                            string cityName = reader.GetString(reader.GetOrdinal("cityName"));
                            cmb_shi.Items.Clear();  //清除上一次添加的痕迹
                            cmb_shi.Items.Add(cityName);
                        }
                    }
                }
            }

        }
    }
    class Readpromary
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }
}
代码改进后,在cmb_shi中只有一个可选项,具体如图:

作者: 吴春晟    时间: 2011-11-16 15:42
  1. while (reader.Read())
  2.                          {
  3.                              // cityItem.Name = reader.GetString(reader .GetOrdinal ("cityName"));
  4.                              string cityName = reader.GetString(reader.GetOrdinal("cityName"));
  5.                              cmb_shi.Items.Clear();  //清除上一次添加的痕迹
  6.                              cmb_shi.Items.Add(cityName);
复制代码
你cmb_shi.Items.Clear();  //清除上一次添加的痕迹

不能添加到 While语句中,

不然结果只能是只有一个ITEMS




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2