実装のアイデア:
DataGridViewでデータを変更し、最初に変更インターフェースをポップアップし、変更前の情報を表示してから、変更ページでデータベースを変更および更新します
**
1. [変更]をクリックして変更インターフェースをポップアップし、選択した中央の行の情報をインターフェースに表示します
**
- ページの「変更」をクリックすると、変更ページがポップアップし、変更する行の情報が変更ページに自動的に表示されます
- 実装プロセス:
1. [変更]をクリックして、マウスで選択した学生番号を取得し、その値を新しいフォーム(情報変更インターフェース)に転送します。新しいフォームはデータベースを読み取り、StuId学生番号に従って関連情報を読み込みます。
注:変更インターフェースを現在の「学生リスト」の親フォームとして設定し、メインインターフェースに表示されるページを作成します
。frmEditStudent.Tagは、インターフェースのデータオブジェクト、オブジェクトタイプです。
//1 获取我当前点击的单元格的行列数索引
//2 判断是否选择的是link列,并且判断是 删除还是修改
DataRow dr = (dgvStudents.Rows[e.RowIndex].DataBoundItem as DataRowView).Row;
DataGridViewCell cell = dgvStudents.Rows[e.RowIndex].Cells[e.ColumnIndex];
if (cell is DataGridViewLinkCell && cell.FormattedValue.ToString() == "修改")
{
//修改操作,打开修改页面,并把stuId传过去
//传值法:tag属性
int stuId = (int)dr["StuId"];
FrmEditStudent frmEditStudent = new FrmEditStudent();
frmEditStudent.Tag = stuId;//这里用的是tag属性传值
frmEditStudent.MdiParent = this.MdiParent;//指定修改页面的父容器
frmEditStudent.Show();//显示在MDI窗体内
}
新しいフォームインターフェイスでは、フォーム読み込み機能。
private void FrmEditStudent_Load(object sender, EventArgs e)
{
MessageBox.Show("您要修改的信息的学生学号为"+ "\n" + this.Tag.ToString(), "温馨提示");
InitClasses();//加载班级列表
InitStuInfo();//加载学生信息
}
クリックされたデータの最初の行の学生IDは1002であり、1002はデバッグのために渡されるタグ属性の値です。
最初に、クラスリストをロードします。クラステーブルとグレードテーブルは次のとおりです:
クエリステートメント
select ClassId,ClassName,GradeName from ClassInfo c,GradeInfo g where c.GradeId = g.GradeId
クエリの結果:
アイデア:SQLステートメントを介してクエリを作成し、データベースのデータを読み取り、それをDataTableタイプとして保存してから、情報をcomboxの指定されたデータソースに送信します。ショー
//--------------加载班级列表-----------------------------------
private void InitClasses()
{
//获取数据 联合查询
string sql = "select ClassId,ClassName,GradeName from ClassInfo c,GradeInfo g where c.GradeId = g.GradeId";
DataTable dtClasses = SqlHelper.GetDataTable(sql);//把数据库中的数据读出来,存为DataTable类型
//组合班级列表显示项 遍历过程
if (dtClasses.Rows.Count > 0)
{
foreach (DataRow dr in dtClasses.Rows)
{
string className = dr["ClassName"].ToString();
string gradeName = dr["GradeName"].ToString();
dr["ClassName"] = className + " " + gradeName;
}
}
//指定数据源 并显示
cboClasses.DataSource = dtClasses;
cboClasses.DisplayMember = "ClassName";
cboClasses.ValueMember = "ClassId";
}
学生情報の読み込み:
タグ属性(学生IDが空でないなど)が転送されると、渡された学生IDがint型に変換
され、学生テーブルからクエリが確立され、データが1つずつ読み取られて表示されます。
ExecuteReaderは、できるだけ速くデータベースにクエリを実行し、結果を取得します。SqlDataReaderオブジェクトを返す
CommandBehavior.CloseConnection:オブジェクトを返す前にデータベース接続を閉じないでください
参照ブログ:https : //www.cnblogs.com/st2012/archive/2012/04/06/2435406.html
//---------------------加载学生信息------------------------
private void InitStuInfo()
{
if (this.Tag != null && this.Tag.ToString()!="")
{
int.TryParse(this.Tag.ToString(), out stuId);
}
//查询数据
string sql = "select StuName,Sex,ClassId,Phone from StudentInfo where StuId=@StuId";
SqlParameter paraId = new SqlParameter("@StuId",stuId);
SqlDataReader dr = SqlHelper.ExecuteReader(sql,paraId);
//读取数据 数据读取流只能向前不能后退,读一条丢一条
if (dr.Read())
{
txtStuName.Text = dr["StuName"].ToString();
txtPhone.Text = dr["Phone"].ToString();
string sex = dr["Sex"].ToString();
int classId = (int)dr["ClassId"];
if (sex == "男")
{
rbtMale.Checked = true;
}
else
{
rbtFemale.Checked = true;
}
cboClasses.SelectedValue = classId;
}
dr.Close();
}
/// <summary>
/// 执行查询,返回 SqlDataReader 数据库读取的行数据流zyh
/// </summary>
/// <param name="sql"></param>
/// <param name="paras"></param>
/// <returns></returns>
public static SqlDataReader ExecuteReader(string sql,params SqlParameter[] paras)
{
//打开数据库
SqlConnection conn = new SqlConnection(connString);
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Clear();
cmd.Parameters.AddRange(paras);
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
catch (SqlException ex)
{
conn.Close();
throw new Exception("执行查询出现异常",ex);
}
}