如何从 datagridview 创建 Master Detail
How to create Master Detail from datagridview
此代码插入数据库
private void btnSave_Click(object sender, EventArgs e)
{
byte[] imageBt = null;
FileStream fstream = new FileStream(this.txtImgPath.Text,FileMode.Open,FileAccess.Read);
BinaryReader Br = new BinaryReader(fstream);
imageBt = Br.ReadBytes((int)fstream.Length);
// byte[] pic = stream.ToArray();
try
{
conDB.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = conDB;
command.CommandText = "insert into abaanaCC (CCSpn_CODE,CCFname,CCLname,CCMname,CCDOB,CCgender,CCSchool,CaClass,CCVillage,CCSiblings,CCGuardian,CCContact,CCImage)" +
" values ('" + spn_codetxt.Text + "','" + txtfname.Text + "','" + lnametxt.Text + "','" + mnametxt.Text + "','" + DOBDTPicker1.Text + "','" + gendercomboBox.Text + "','" + schtxt.Text + "','" + classcomboBox.Text + "','" + villatxt.Text + "','" + siblingscombobx.Text + "','" + guardiantxt.Text + "','" + contacttxt.Text + "',@IMG) ";
command.Parameters.Add(new OleDbParameter("@IMG",imageBt));
//command.Parameters.AddWithValue("@IMG",pic);
command.ExecuteNonQuery();
MessageBox.Show("Record Saved");
}
catch (Exception ex)
{
MessageBox.Show("Unable to save" + ex);
}
conDB.Close();
}
那么这是 datagridview
private void Update_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'abaanaDataSet.abaanaCC' table. You can move, or remove it, as needed.
this.abaanaCCTableAdapter.Fill(this.abaanaDataSet.abaanaCC);
}
我正在使用单元格点击事件,这样当一个单元格被点击时,该行的内容,即 CCImage
和 CCSpn_CODE
出现。 CCSpn_CODE
出现在Ptxtspn_code
textBox
就好了。问题是我正在转换的 byte[] 图像。它只显示第一行的图像。我怎样才能让 PpicBox
显示我点击 datagridView
的任何行的任何图像,就像 Ptxtspn_code
textBox
private void abaanaCCDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
this.Ptxtspn_code.Text = this.abaanaCCDataGridView.SelectedRows[0].Cells[this.dataGridViewTextBoxColumn2.Name].Value.ToString();
this.abaanaCCTableAdapter.Fill(this.abaanaDataSet.abaanaCC);
byte[] mydata = (byte[])this.abaanaDataSet.abaanaCC.Rows[0]["CCImage"];
MemoryStream stream = new MemoryStream(mydata);
this.PpicBox.Image =Image.FromStream(stream);
}
注:
- 在
CellClick
事件中,您应该检查点击是否不在行 header 或列 header
e.RowIndex
是被点击单元格的行索引,e.ColumnIndex
是被点击单元格的列索引
- 要获取点击行的值,您可以使用:
yourDGV.Rows[e.RowIndex].Cells["GridColumnName"].value
yourDGV.Rows[e.RowIndex].Cells[2].Value
((DataRowView)yourDGV.Rows[e.RowIndex].DataBoundItem)[2]
((DataRowView)yourDGV.Rows[e.RowIndex].DataBoundItem)["DataTableColumnName"]
- 我不知道你为什么要在
CellClick
中填写 abaanaCC,因为你在表单加载事件中加载数据,所以包括 CCImage 在内的所有值都存在于你的数据 table 中。所以我删除了它。看来只有当你想在单元格点击时加载不在这里的数据时才应该填写它。
例如,您的代码可能是这样的:
private void abaanaCCDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0 || e.ColumnIndex < 0)
return;
this.Ptxtspn_code.Text = this.abaanaCCDataGridView.Rows[e.RowIndex].Cells[this.dataGridViewTextBoxColumn2.Name].Value.ToString();
byte[] mydata = (byte[])this.abaanaDataSet.abaanaCC.Rows[r.RowIndex]["CCImage"];
MemoryStream stream = new MemoryStream(mydata);
this.PpicBox.Image =Image.FromStream(stream);
}
此代码插入数据库
private void btnSave_Click(object sender, EventArgs e)
{
byte[] imageBt = null;
FileStream fstream = new FileStream(this.txtImgPath.Text,FileMode.Open,FileAccess.Read);
BinaryReader Br = new BinaryReader(fstream);
imageBt = Br.ReadBytes((int)fstream.Length);
// byte[] pic = stream.ToArray();
try
{
conDB.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = conDB;
command.CommandText = "insert into abaanaCC (CCSpn_CODE,CCFname,CCLname,CCMname,CCDOB,CCgender,CCSchool,CaClass,CCVillage,CCSiblings,CCGuardian,CCContact,CCImage)" +
" values ('" + spn_codetxt.Text + "','" + txtfname.Text + "','" + lnametxt.Text + "','" + mnametxt.Text + "','" + DOBDTPicker1.Text + "','" + gendercomboBox.Text + "','" + schtxt.Text + "','" + classcomboBox.Text + "','" + villatxt.Text + "','" + siblingscombobx.Text + "','" + guardiantxt.Text + "','" + contacttxt.Text + "',@IMG) ";
command.Parameters.Add(new OleDbParameter("@IMG",imageBt));
//command.Parameters.AddWithValue("@IMG",pic);
command.ExecuteNonQuery();
MessageBox.Show("Record Saved");
}
catch (Exception ex)
{
MessageBox.Show("Unable to save" + ex);
}
conDB.Close();
}
那么这是 datagridview
private void Update_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'abaanaDataSet.abaanaCC' table. You can move, or remove it, as needed.
this.abaanaCCTableAdapter.Fill(this.abaanaDataSet.abaanaCC);
}
我正在使用单元格点击事件,这样当一个单元格被点击时,该行的内容,即 CCImage
和 CCSpn_CODE
出现。 CCSpn_CODE
出现在Ptxtspn_code
textBox
就好了。问题是我正在转换的 byte[] 图像。它只显示第一行的图像。我怎样才能让 PpicBox
显示我点击 datagridView
的任何行的任何图像,就像 Ptxtspn_code
textBox
private void abaanaCCDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
this.Ptxtspn_code.Text = this.abaanaCCDataGridView.SelectedRows[0].Cells[this.dataGridViewTextBoxColumn2.Name].Value.ToString();
this.abaanaCCTableAdapter.Fill(this.abaanaDataSet.abaanaCC);
byte[] mydata = (byte[])this.abaanaDataSet.abaanaCC.Rows[0]["CCImage"];
MemoryStream stream = new MemoryStream(mydata);
this.PpicBox.Image =Image.FromStream(stream);
}
注:
- 在
CellClick
事件中,您应该检查点击是否不在行 header 或列 header e.RowIndex
是被点击单元格的行索引,e.ColumnIndex
是被点击单元格的列索引- 要获取点击行的值,您可以使用:
yourDGV.Rows[e.RowIndex].Cells["GridColumnName"].value
yourDGV.Rows[e.RowIndex].Cells[2].Value
((DataRowView)yourDGV.Rows[e.RowIndex].DataBoundItem)[2]
((DataRowView)yourDGV.Rows[e.RowIndex].DataBoundItem)["DataTableColumnName"]
- 我不知道你为什么要在
CellClick
中填写 abaanaCC,因为你在表单加载事件中加载数据,所以包括 CCImage 在内的所有值都存在于你的数据 table 中。所以我删除了它。看来只有当你想在单元格点击时加载不在这里的数据时才应该填写它。
例如,您的代码可能是这样的:
private void abaanaCCDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0 || e.ColumnIndex < 0)
return;
this.Ptxtspn_code.Text = this.abaanaCCDataGridView.Rows[e.RowIndex].Cells[this.dataGridViewTextBoxColumn2.Name].Value.ToString();
byte[] mydata = (byte[])this.abaanaDataSet.abaanaCC.Rows[r.RowIndex]["CCImage"];
MemoryStream stream = new MemoryStream(mydata);
this.PpicBox.Image =Image.FromStream(stream);
}