目前尚不清楚您要达到的目标。看来您有两种形式。在表单 (form1) 上有一个 DataGridView 和一个 Button 用于向网格添加新行。在第二个表单 (form2) 上有两个文本框和一个组合框以及一个“确定”按钮。我猜这些文本框是用来让用户输入新的“名称”和“格式”数据。然后,当用户单击“确定”按钮时,文本框中的数据将添加到 form1 中DataGridView 的新行中。最后,DataGridView 每一行上的“编辑”按钮允许用户打开 SAME form2(用于添加新项目)并使用它来编辑用户单击的行。
我希望我理解正确。这是可行的,并且有很多方法可以实现这一目标。我只能假设有一些原因你不会直接在网格中“添加”或“编辑”这些单元格。 DataGridView“添加新行”或“编辑单元格”的默认行为已经实现,当您可以在没有新表单2的情况下实现相同的事情并且绝对不需要代码时,不需要表单2来执行此操作.因此,我假设您不能直接在网格中编辑单元格是有原因的。拥有DataSource 可能是一个原因(见下文)......
下面的答案是实现这一目标的一种方法。如果有DataSource 和DataGridView,我必须发出警告。但是,您可以使用这种方法,每当下面的代码添加或编辑网格中的单元格时,它都是通过直接访问网格单元格来实现的。如果有DataSource 附加到网格,这将不起作用。如果有DataSource,那么当下面的代码添加或编辑项目时,您需要更改代码以对DataSource 而不是网格本身执行这些添加/编辑操作。
大部分工作都可以在Form2 中完成。在“添加”或“编辑”两种情况下,Form2 至少需要来自Form1 的一项……那就是Form1 的DataGridView。以“添加”方法为例,需要Form1 的DataGridView 才能添加新行。这可以通过简单地为Form2 创建一个新的构造函数来实现,该构造函数在其签名中采用DataGridView。下面的代码是如何从Form1 的btnAdd_Click 事件中调用这个新的构造函数。
private void btnAdd_Click(object sender, EventArgs e) {
Form2 f2 = new Form2(dataGridView1);
f2.ShowDialog();
}
现在我们需要在Form2 中创建这个构造函数。由于在用户按下“添加/确定”按钮之前不会添加新行,因此我们需要保存构造函数传入的Fom1的DataGridView。因此创建了一个全局DataGridView 变量parentDGV。调用构造函数时,我们只需将parentDGV 设置为传入的DataGridView。这将允许在“添加”方法中访问网格。
DataGridView parentDGV;
public Form2(DataGridView dgv) {
parentDGV = dgv;
InitializeComponent();
}
由于我们现在可以访问Form1 的DataGridView,您可以简单地添加新行。没有进行错误检查,因此文本框可能为空。下面是Form2的“添加”按钮点击事件。
private void btnAddToGrid_Click(object sender, EventArgs e) {
parentDGV.Rows.Add(txtName.Text, txtFormat.Text);
}
这应该允许用户通过Form2 的“添加”按钮在Form1 的DataGridView 中添加新的数据行。
接下来,我们需要注意DataGridView 每一行上的“编辑”按钮。如果您想使用相同的Form2 来编辑行,那么您将需要进行一些更改,因为它目前只会添加行。要使Form2 正常工作,它需要知道用户是否单击了Form1 上的“编辑”或“添加”按钮。实现此目的的一种方法是为Form2 创建另一个构造函数。这个构造函数显然需要Form1 的DataGridView,但也需要单击“编辑”按钮的“行”索引。这将为我们提供要编辑的行的行索引。我们可以创建一个全局的int 变量“editRowIndex”,以允许Form2 中的其他方法访问。
DataGridView parentDGV;
int editRowIndex;
public Form2(DataGridView dgv, int rowIndex) {
parentDGV = dgv;
editRowIndex = rowIndex;
InitializeComponent();
SetEditForm();
}
SetEditForm 方法通过用要编辑的数据填充文本框来对表单进行一些外观更改,将“添加”按钮文本更改为“更新”,更重要的是,将按钮“单击”事件处理程序更改为更新网格中的行而不是添加新行。
private void SetEditForm() {
btnAddToGrid.Text = "Update";
this.btnAddToGrid.Click -= this.btnAddToGrid_Click;
this.btnAddToGrid.Click += new System.EventHandler(this.btnAddToGrid_EditClick);
if (parentDGV.Rows[editRowIndex].Cells["AName"].Value != null)
txtName.Text = parentDGV.Rows[editRowIndex].Cells["AName"].Value.ToString();
else
txtName.Text = "";
if (parentDGV.Rows[editRowIndex].Cells["Format"].Value != null)
txtFormat.Text = parentDGV.Rows[editRowIndex].Cells["Format"].Value.ToString();
else
txtFormat.Text = "";
// set combo box value
}
下面是EditClick 事件,用于使用Form2 文本框中的新数据更新网格中的正确行。我假设一旦用户完成编辑,表单就会关闭。
private void btnAddToGrid_EditClick(object sender, EventArgs e) {
parentDGV.Rows[editRowIndex].Cells["AName"].Value = txtName.Text;
parentDGV.Rows[editRowIndex].Cells["Format"].Value = txtFormat.Text;
this.Close();
}
最后,要注意的最后一部分是当用户在Form1 的DataGridview 中的某一行上单击“编辑”按钮时。为了处理这个问题,DataGridView 的 CellClick 事件被连接起来。一旦单击的单元格被确定为“编辑”按钮,我们只需使用适当的构造函数创建新的Form2。
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
if ((e.RowIndex >= 0) && (!dataGridView1.Rows[e.RowIndex].IsNewRow) ) {
if (e.ColumnIndex >= 0) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Edit") {
Form2 f2 = new Form2(dataGridView1, e.RowIndex);
f2.ShowDialog();
}
}
}
}
我希望这是有道理的。把它们放在一起……使用“设计器”……Form1 有一个DataGridView,带有两个文本框列(AName、Format)和第三个按钮列(Edit),用于通过Form2 编辑行。此外,Form1 有一个按钮可以通过Form2“添加”新行
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
FillGrid();
}
private void FillGrid() {
dataGridView1.Rows.Add("Cell00Data", "Cell01Data");
dataGridView1.Rows.Add("Cell10Data", "Cell11Data");
dataGridView1.Rows.Add("Cell20Data", "Cell21Data");
dataGridView1.Rows.Add("Cell30Data", "Cell31Data");
}
private void btnAdd_Click(object sender, EventArgs e) {
Form2 f2 = new Form2(dataGridView1);
f2.ShowDialog();
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
if ((e.RowIndex >= 0) && (!dataGridView1.Rows[e.RowIndex].IsNewRow) ) {
if (e.ColumnIndex >= 0) {
if (dataGridView1.Columns[e.ColumnIndex].Name == "Edit") {
Form2 f2 = new Form2(dataGridView1, e.RowIndex);
f2.ShowDialog();
}
}
}
}
Form2:使用“设计器”,Form2 有两个文本框(txtName、txtFormat)用于“名称”和“格式”,Button 可以将信息“添加”为新项目或“更新”网格中的一行。
DataGridView parentDGV;
int editRowIndex;
// Constructor to Add a new row
public Form2(DataGridView dgv) {
parentDGV = dgv;
InitializeComponent();
}
// Constructor to Edit a row
public Form2(DataGridView dgv, int rowIndex) {
parentDGV = dgv;
editRowIndex = rowIndex;
InitializeComponent();
SetEditForm();
}
// update form for edit mode
private void SetEditForm() {
btnAddToGrid.Text = "Update";
this.btnAddToGrid.Click -= this.btnAddToGrid_Click;
this.btnAddToGrid.Click += new System.EventHandler(this.btnAddToGrid_EditClick);
if (parentDGV.Rows[editRowIndex].Cells["AName"].Value != null)
txtName.Text = parentDGV.Rows[editRowIndex].Cells["AName"].Value.ToString();
else
txtName.Text = "";
if (parentDGV.Rows[editRowIndex].Cells["Format"].Value != null)
txtFormat.Text = parentDGV.Rows[editRowIndex].Cells["Format"].Value.ToString();
else
txtFormat.Text = "";
// set combo box value
}
// Button click event to update form1’s grid
private void btnAddToGrid_EditClick(object sender, EventArgs e) {
parentDGV.Rows[editRowIndex].Cells["AName"].Value = txtName.Text;
parentDGV.Rows[editRowIndex].Cells["Format"].Value = txtFormat.Text;
this.Close();
}
// Button click event to add a row to form1’s grid
private void btnAddToGrid_Click(object sender, EventArgs e) {
parentDGV.Rows.Add(txtName.Text, txtFormat.Text);
}