C#学生管理システム - 授業管理の授業一覧(クエリ機能)
前回の成績表が完成しました。今日はクラス管理でクラス一覧を作成します。クラス一覧には、成績表とは異なり、以下に示すようにクエリ機能があります。
インターフェースレイアウト部分:
簡単に書き留めて、クエリを実行します。この明るい色のボックスは GroupBox です。その機能はタイトル付きのボックスです (見た目だけのため、役に立ちません)。グレードはラベル ラベルです。コンボボックス、クラス テキストボックスを使用してグレードのドロップダウン メニュー ボックスを選択します。クエリボタンボタン。
下部は表を表示する必要があるので、前回の成績表のインターフェース設定と同じで、何も書かずにDatagridviewを制御します。
使用するいくつかのコントロールに名前を付けます:
グレードのドロップダウン メニュー -
cmbgrade クラスのテキストボックス -
テキストクラスの下半分の情報を表示するテーブル Datagridview - dgvclass
データベース:
データベースには class という名前が付けられ、次の図に示すように 4 つの重要な情報があります:
cid - クラス番号、
cname - クラス名、
gid - 成績番号 (後で成績表に関連付けられます)、
remark - 備考。
機能実装部分:
まず、クラス リスト インターフェイスをクリックすると、クラスのドロップダウン メニューと全クラス リストが自動的にロードされ、2 つの初期化関数が呼び出されます。
private void list_class_Load(object sender, EventArgs e)
{
initgrade(); //初始化加载年级列表
initclass(); //初始化加载班级列表
}
成績リストの初期化:
一般的な考え方は、ドロップダウン メニューを取得するには Datatable が必要であり、cmbclass
1 に割り当てられます。 成績情報を取得する SQL ステートメントと SQL ステートメントを取得する Datatable を記述します。
string sql = "select * from [grade]";
DataTable dtgrade = sqlhelper.getDataTable(sql);
2. 成績表のデータを取得する
//获取grade表中数据
cmbgrade.DataSource = dtgrade; //comboBox来获取datatable
cmbgrade.DisplayMember = "gname"; //设置绑定的数据库对应的名称,显示的内容
cmbgrade.ValueMember = "gid";
3. (追加手順) デフォルトでは「選択してください」が表示されます。
//默认“请选择“;添加一行
DataRow drow = dtgrade.NewRow();
drow["gid"] = 0;
drow["gname"] = "请选择";
dtgrade.Rows.InsertAt(drow, 0); //使dt.Rows.Add(dr)只是把选项追加到最后,而使用dt.Rows.InsertAt(dr, 0)可以把增加的选项插入到相应的位置上
クラス リストの初期化:
ここでの初期ロードでは、番号、クラス、およびグレードの情報を表示する必要があります。グレード名を表示するには、データベース内のクラス テーブルの gid がグレード テーブルの gid と一致する必要があります。データベースは内部結合を使用します。 ...2 つのテーブルを関連付けます。
string sql = "SELECT cid, cname, gname FROM class c INNER JOIN grade g ON c.gid = g.gid ORDER BY c.cid";
DataTable dclass = sqlhelper.getDataTable(sql);
dgvclass.DataSource = dclass;
初期化が完了すると、クエリ関数だけが残ります。次に、複雑なクエリ ボタンを作成します。
クエリボタンの機能設計:
1. ユーザー入力情報の取得
ここに注目してください。!!SelectedValue を使用して取得されたドロップダウン メニュー ボックスのデータはオブジェクト型です。強制変換を試すことはできますが、私の VS はそれを認識せず、常にエラーを報告します。多くの努力の結果、ToString を使用して次のことができることがわかりました。文字列形式を取得し、最後に int 型に変換します。これ以外の方法は本当に思いつきません。これを見て何か提案がある場合は、プライベート メッセージを送ってください。
int setid=(int)cmbgrade.SelectedValue
string _value = cmbgrade.SelectedValue.ToString();
int setgid = int.Parse(_value);
string setclass = textclass.Text.Trim();
2. 取得したデータが空かどうかを判断します
空であるかどうかに関係なく、SQL ステートメントを使用してクラスを初期化する必要があります。表示される内容は同じなので、SQL ステートメントが常に true であることを示すために、前の SQL ステートメントの後に where 1=1 を追加します。いいえ、
0の場合はSQL文に条件を追加します。入力されたグレードIDはテーブルのグレードIDと一致します。同様に、取得したsetclassが空かどうかを判定し、ファジークエリが実行されます。
string sql = "select c.cid, c.cname, g.gname from (class c INNER JOIN grade g ON c.gid = g.gid) where 1=1 ";
//判断
if (setgid != 0)
{
sql += " and c.gid=@gid";
}
if (!string.IsNullOrEmpty(setclass))
{
sql += " and cname like @cname";
}
//定义参数数组 进行传参
OleDbParameter[] paras ={
new OleDbParameter("@gid",setgid),
new OleDbParameter("@cname","%"+setclass+"%")
};
DataTable dclass = sqlhelper.getDataTable(sql,paras);
dgvclass.DataSource = dclass;
ここでのファジー クエリの問題に注意してください。SQL ステートメントに % を追加しないでください。有効にするためにパラメータを渡すときに最後に % を追加します。
この部分はここで終了です 実行:
生徒リストはクラスリストと似ています 次回はレイアウトや機能の実装についてはあまり書かず、少しだけ体験談を書きます。
添付: 今日の完全なコード:
private void list_class_Load(object sender, EventArgs e)
{
initgrade(); //初始化加载年级列表
initclass(); //初始化加载班级列表
}
private void initgrade()
{
//下拉菜单也要datatable来获取,然后指定给comboBox
//用displaymember来show显示的值
string sql = "select * from [grade]";
DataTable dtgrade = sqlhelper.getDataTable(sql);
//默认“请选择“;添加一行
DataRow drow = dtgrade.NewRow();
drow["gid"] = 0;
drow["gname"] = "请选择";
dtgrade.Rows.InsertAt(drow, 0); //使用dt.Rows.Add(dr)只是把选项追加到最后,而使用dt.Rows.InsertAt(dr, 0)可以把增加的选项插入到相应的位置上
//获取grade表中数据
cmbgrade.DataSource = dtgrade; //comboBox来获取datatable
cmbgrade.DisplayMember = "gname"; //设置绑定的数据库对应的名称,显示的内容
cmbgrade.ValueMember = "gid";
}
private void initclass()
{
string sql = "SELECT cid, cname, gname FROM class c INNER JOIN grade g ON c.gid = g.gid ORDER BY c.cid";
DataTable dclass = sqlhelper.getDataTable(sql);
dgvclass.DataSource = dclass;
}
//查询
private void btncha_Click(object sender, EventArgs e)
{
//获取输入信息
string _value = cmbgrade.SelectedValue.ToString();
int setgid = int.Parse(_value);
string setclass = textclass.Text.Trim();
string sql = "select c.cid, c.cname, g.gname from (class c INNER JOIN grade g ON c.gid = g.gid) where 1=1 ";
//判断
if (setgid != 0)
{
sql += " and c.gid=@gid";
}
if (!string.IsNullOrEmpty(setclass))
{
sql += " and cname like @cname";
}
//定义参数数组 进行传参
OleDbParameter[] paras ={
new OleDbParameter("@gid",setgid),
new OleDbParameter("@cname","%"+setclass+"%")
};
DataTable dclass = sqlhelper.getDataTable(sql,paras);
dgvclass.DataSource = dclass;
}