page contents

C# ComboBox的联动操作

本文讲述了C# ComboBox的联动操作!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-05-SDqaBCLr62902bbc6b1c3.png

本文讲述了C# ComboBox的联动操作!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

项目需求:根据年级下拉框的变化使得科目下拉框绑定次年级下对应有的值

我们用三层架构的模式来实现

1.我们想和数据库交互,我们首先得来先解决DAL数据库交互层

01.获得年级下拉框的数据

在GradeDAL类中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using MySchool.Model;
using System.Configuration;
namespace MySchool.DAL
{
 //数据访问层
 public class GradeDAL
 {
  public static string Constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
  #region 获得年级表
   public DataTable SelectGrade(string gradetype)
  {
   //和数据库交互
   string str = "Data Source=.;initial catalog=MySchool;uid=sa";
   SqlConnection con = new SqlConnection(str);
   string sql = "";
   if (gradetype=="")
   {
    sql = "select * from Grade";
   }
   else
   {
    sql = "select * from Student where GradeId in (select GradeId from Grade where GradeName='" + gradetype + "')";
   }
    
   SqlDataAdapter da = new SqlDataAdapter(sql, con);
   DataSet ds = new DataSet();
   //捕获异常
   try
   {
    da.Fill(ds, "stuInfo");
   }
   catch (Exception ex)
   {
 
    throw new Exception(ex.Message);
   }
   //返回一张表的数据
   return ds.Tables["stuInfo"];
  }
  #endregion
 
  #region 获取年级数据,为在下拉框中显示
   //定义一个集合,储存年级信息
   List<Grade> list = new List<Grade>();
   #region 方法一: 以返回表的方式
   public DataTable LoadCombox()
   {
    string sql = "select * from Grade";
    DataTable dt = SQLHelper.ExecuteDataTable(sql);
    return dt;
   }
   #endregion
 
   #region 方法二:以返回集合的方式
 
   public List<Grade> Loadcombox2()
   {
    string sql = "select * from Grade";
    DataTable dt = SQLHelper.ExecuteDataTable(sql);
    //方法一:
    foreach (DataRow row in dt.Rows)
    {
     //每一个row代表表中的一行,所以一行对应一个年级对象
     Grade grade = new Grade();
     grade.GradeId = Convert.ToInt32(row["gradeid"]);
     grade.GradeName = row["gradename"].ToString();
     list.Add(grade);
    }
    //方法二:(使用MyTool类)
 
    //MyTool tool=new MyTool();
    //list = tool.DataTableToList<Grade>(dt);
    return list;
   }
  #endregion
 
   #region 方法三:要求使用using语句
   public List<Grade> LoadCombox3()
   {
    //using的作用可以释放资源,利于资源的回收(可以省略关闭连接)
    using (SqlConnection con=new SqlConnection(Constr))
    {
     try
     {
      string sql = "select * from Grade";
      SqlCommand cmd = new SqlCommand(sql,con);
      con.Open();
      SqlDataReader dr = cmd.ExecuteReader();
      while (dr.Read())
      {
       Grade gr = new Grade();
       gr.GradeId = Convert.ToInt32(dr["GradeId"]);
       gr.GradeName=dr["GradeName"].ToString();
       list.Add(gr);
      }
     
     }
     catch (Exception ex)
     {
 
      throw new Exception(ex.Message);
     }
    }
    return list;
   }
  #endregion
 
   #endregion
 
   
   
 
   
 }
}

02.在业务逻辑层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySchool.DAL;
using System.Data;
using MySchool.Model;
namespace MySchool.BLL
{
 public class GradeBLL
 {
  GradeDAL gradedal = new GradeDAL();
  #region 获取年级数据,为在下拉框中显示
 
  public DataTable SelectGrade(string gradetype)
  {
   return gradedal.SelectGrade(gradetype);
  }
 
  public DataTable LoadCombox()
  {
   return gradedal.LoadCombox();
  }
   
 
  public List<Grade> Loadcombox2()
  {
   return gradedal.Loadcombox2();
  }
 
 
  #endregion
 
  public List<Grade> LoadCombox3()
  {
   return gradedal.LoadCombox3();
  }
 
   
 }
}

03.在窗体UI层

在Load事件中加载年级下拉框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
private void FrmSelectResult_Load(object sender, EventArgs e)
 {
  #region 加载年级下拉框
  try
  {
   List<Grade> list = gradedal.LoadCombox3();
   list.Insert(0, new Grade() { GradeId=-1,GradeName="--全部--" });
   cboGrade.ValueMember = "GradeId";
   cboGrade.DisplayMember = "GradeName";
   cboGrade.DataSource = list;
  }
  catch (Exception ex)
  {
 
   MessageBox.Show(ex.Message);
  }
   
   
  #endregion
 
  #region 加载科目下拉框
  //try
  //{
  // list2 = subjectdal.LoadComboxSub();
  // list2.Insert(0, new Subject() { SubjectId = -1, SubjectName = "--全部--" });
  // cboSubject.ValueMember = "SubjectId";
  // cboSubject.DisplayMember = "SubjectName";
  // cboSubject.DataSource = list2;
  //}
  //catch (Exception ex)
  //{
 
  // MessageBox.Show(ex.Message);
  //}
   
  #endregion
 }

其中在使用

获得年级下拉框隐藏值得方法(2)
int num = Convert.ToInt32(cboGrade.SelectedValue);

加载年级下拉框时:会出现的错误的写法

把cboGrade.DataSource = list;写在
 cboGrade.ValueMember = "GradeId";
 cboGrade.DisplayMember = "GradeName";
上面
即:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#region 加载年级下拉框
  try
  {
   List<Grade> list = gradedal.LoadCombox3();
   list.Insert(0, new Grade() { GradeId=-1,GradeName="--全部--" });
   cboGrade.DataSource = list;
   cboGrade.ValueMember = "GradeId";
   cboGrade.DisplayMember = "GradeName";
    
    
  }
  catch (Exception ex)
  {
 
   MessageBox.Show(ex.Message);
  }
   
   
  #endregion

这是就会出现下面错误:

在年级的SelectedIndexChanged事件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
try
  {
 
   //根据年级取得科目信息并绑定
   #region 获得年级下拉框隐藏值得方法(1)
   Grade sub = (Grade)cboGrade.SelectedItem;
   int num =sub.GradeId;
   #endregion
 
   #region 获得年级下拉框隐藏值得方法(2)
   // int num = Convert.ToInt32(cboGrade.SelectedValue.ToString());
   #endregion
    
   List<Subject> list = subjectdal.LoadComboxSub2(num);
    
   cboSubject.ValueMember = "SubjectId";
   cboSubject.DisplayMember = "SubjectName";
   cboSubject.DataSource = list;
    
 
    
  }
  catch (Exception)
  {
 
   MessageBox.Show("出错");
  }

以上就是本文的全部内容,更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg


  • 发表于 2022-05-27 09:39
  • 阅读 ( 556 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章