黑马程序员技术交流社区

标题: 关于ADO.NET的一个小问题 [打印本页]

作者: 小天    时间: 2013-8-14 01:15
标题: 关于ADO.NET的一个小问题
本帖最后由 小天 于 2013-8-14 09:47 编辑

希望大家帮忙分析一下,愁死我了,为什么cb省里添加的是对象而不是从数据库中读出来的字段?
代码如下
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 test10
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
         private void cb省_SelectedIndexChanged(object sender, EventArgs e)
          {
                     Province item = (Province)cb省.SelectedItem;
                    int id = item.Id;
                    using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\mydb1.mdf;Integrated Security=True;User Instance=True"))
                    {
                        conn.Open();
                        using (SqlCommand cmd = conn.CreateCommand())
                        {
                            cmd.CommandText = "select * from T_City where FProvinceId=@id";
                            cmd.Parameters.Add(new SqlParameter("id", id));
                            using (SqlDataReader reader = cmd.ExecuteReader())
                            {
                                cb市.Items.Clear();
                                while (reader.Read())
                                {
                                    string name = reader.GetString(reader.GetOrdinal("FCity"));
                                    cb市.Items.Add(name);
                                }
                            }
                        }
                    }
          }
        private void Form1_Load(object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDBFilename=|DataDirectory|\mydb1.mdf;Integrated Security=True;User Instance=True"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select * from T_Province";
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Province item = new Province();
                            item.Id = reader.GetInt32(reader.GetOrdinal("Id"));
                            item.Name = reader.GetString(reader.GetOrdinal("FProvince"));
                            cb省.Items.Add(item);
                        }
                    }
                }
            }            
        }
    }
    class Province
    {
        public string Name { set; get; }
        public int Id { set; get; }
    }           
}

cw.jpg (14.71 KB, 下载次数: 0)

cw.jpg

作者: 许庭洲    时间: 2013-8-14 06:38
注释掉cb市.Items.Clear();试试看
作者: gb2312_8    时间: 2013-8-14 09:31
本帖最后由 gb2312_8 于 2013-8-14 09:52 编辑

他这一步还没有访问到“cb省_SelectedIndexChanged”这个方法,现在是省还没有绑定上,你改一下这句代码: cb省.Items.Add(item.Name);还有就是绑定数据源
  1. List<Province> li = new List<Province>();

  2.                         while (reader.Read())
  3.                         {
  4.                            
  5.                             Province item = new Province();
  6.                             item.Id = reader.GetInt32(reader.GetOrdinal("id"));
  7.                             item.Name = reader.GetString(reader.GetOrdinal("name"));
  8.                             li.Add(item);
  9.                            

  10.                         }
  11.                         cb省.DataSource = li;
  12.                         cb省.DisplayMember = "Name";
  13.                         cb省.ValueMember = "Id";
复制代码

作者: 小天    时间: 2013-8-14 09:47
谢谢大家,问题已经解决
作者: 小天    时间: 2013-8-14 09:50
许庭洲 发表于 2013-8-14 06:38
注释掉cb市.Items.Clear();试试看

如果注释掉cb市.Items.Clear();的话,每次选择cb省的下拉框的时候都会在cb市这个下拉框里添加
作者: 小天    时间: 2013-8-14 09:54
gb2312_8 发表于 2013-8-14 09:31
他这一步还没有访问到“cb省_SelectedIndexChanged”这个方法,现在是省还没有绑定上,你改一下这句代码: c ...

cb省.Items.Add(item.Name);修改以后cb省的下拉框可以显示省名,但是市那个下拉框就出错了,提示:
无法将类型为“System.String”的对象强制转换为类型“test10.Province”
作者: gb2312_8    时间: 2013-8-14 09:56
小天 发表于 2013-8-14 09:54
cb省.Items.Add(item.Name);修改以后cb省的下拉框可以显示省名,但是市那个下拉框就出错了,提示:
无法 ...

你用我第一种方法,只绑定了name,没绑定id,肯定出错,,你用数据源绑定一下,上面我修改了,你看看
作者: 小天    时间: 2013-8-14 10:12
gb2312_8 发表于 2013-8-14 09:56
你用我第一种方法,只绑定了name,没绑定id,肯定出错,,你用数据源绑定一下,上面我修改了,你看看 ...

测试以后,可以通过,谢谢你的回答




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