C# 来自另一表单上配置的DataGridView的数据
我有一个Form1,它有一个dataGridView和一个向该网格添加内容的按钮。当选择这个按钮时,我调用Form2,它有两个文本框和一个组合框来填充名称、目录和格式(例如),再加上一个OK按钮将行添加到Form1上的dataGridView 当我回到Form1时,dataGridView必须显示输入的内容。我的网格有三列:名称、格式和一个按钮列,当单击它时,可以在Form2的屏幕上重新加载以前填充的信息,并在每个字段中重新加载,以便能够更改或只是查阅 首先,我尝试创建一个函数,通过参数将线添加到我的网格中,如下代码所示: 欧盟表格1提供了数据网格视图,并提供了一个新的网格。所有成员国都有自己的格式,欧盟的格式为文本框和组合框,格式为格式,格式为格式(示例),格式为数据网格视图,格式为1 表格一C# 来自另一表单上配置的DataGridView的数据,c#,datagridview,C#,Datagridview,我有一个Form1,它有一个dataGridView和一个向该网格添加内容的按钮。当选择这个按钮时,我调用Form2,它有两个文本框和一个组合框来填充名称、目录和格式(例如),再加上一个OK按钮将行添加到Form1上的dataGridView 当我回到Form1时,dataGridView必须显示输入的内容。我的网格有三列:名称、格式和一个按钮列,当单击它时,可以在Form2的屏幕上重新加载以前填充的信息,并在每个字段中重新加载,以便能够更改或只是查阅 首先,我尝试创建一个函数,通过参数将线添加
public Form1()
{
InitializeComponent();
}
public void AddRows(string name, string path)
{
dataGridView1.Rows.Add(name, path);
dataGridView1.Update();
}
表格二
public Form2()
{
InitializeComponent();
}
private void bt1_Click(object sender, EventArgs e)
{
var nome = txt_name.Text;
var path = txt_path.Text;
var form1 = new Form1();
form1.AddRows(name, path);
}
然而,它最终没有工作,在网格上没有显示任何内容。因此,我考虑创建一个具有名称、路径和格式方法(get和set)的类,将所有内容存储在对象列表中(我想就是这样,如果我是初学者,请原谅我的错误)。或保存到数据集。但是后来我想,我在我的Form2中实例化了这个类,并在字段中传递了填充的值,但是,我在Form1中做什么呢
我认为这一切都很混乱,如果有人能解释一种更清晰的解决这种情况的方法,我将不胜感激,因为我是初学者。你能试试我的演示吗
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnEdit_Click(object sender, EventArgs e)
{
//change code to get current row and check null, etc
var sels = dataGridView1.SelectedRows;
if (sels == null || sels.Count == 0)
return;
DataGridViewRow selRow = sels[0];
frmDialog dlg = new frmDialog(
selRow.Cells[0].Value,
selRow.Cells[1].Value);
if (dlg.ShowDialog() == DialogResult.OK)
{
selRow.Cells[0].Value = dlg.Col1Value;
selRow.Cells[1].Value = dlg.Col2Value;
//...
}
}
}
public partial class frmDialog : Form
{
public object Col1Value;
public object Col2Value;
//...other properties
public frmDialog()
{
InitializeComponent();
}
public frmDialog(object col1, object col2)
{
InitializeComponent();
this.Col1Value = col1;
this.Col2Value = col2;
//...other properties
}
private void btnOK_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
}
现在还不清楚你想要实现什么。看来你有两种形式。在表单(form1)上有一个
DataGridView
和一个按钮
,用于向网格添加新行。在第二个表单(form2)上有两个文本框、一个组合框和一个“OK”按钮。我猜文本框用于允许用户输入新的“名称”和“格式”数据。然后,当用户单击“确定”按钮时,文本框中的数据将添加到form1中的DataGridView
的新行中。最后,DataGridView
中每一行上的“编辑”按钮允许用户打开相同的form2(用于添加新项目),并使用它编辑用户单击的行
我希望我能正确理解这一点。这是可行的,有很多方法可以实现。我只能假设有某种原因,你不会直接在网格中“添加”或“编辑”这些单元格。DataGridView
的默认行为“添加新行”或“编辑单元格”已经实现,当您可以在不使用新form2的情况下实现相同的操作,并且完全不需要代码时,form2就不需要这样做。因此,我将假设您不能直接在网格中编辑单元格是有原因的。拥有数据源可能是一个原因(见下文)
下面的答案是实现这一目标的一种方法。如果存在带有DataGridView
的DataSource
,我必须发出警告。但是,您可以使用这种方法,只要下面的代码在网格中添加或编辑单元格,它就会直接访问网格单元格。如果有一个数据源连接到网格,这将不起作用。如果存在数据源
,则当下面的代码添加或编辑项目时,您需要更改代码,以便对数据源
而不是网格本身执行这些添加/编辑操作
大部分工作可以在表格2中完成。在“添加”或“编辑”两种情况下,Form2
至少需要Form1
中的一项,Form1
的DataGridView
。以“Add”方法为例,需要Form1
的DataGridView
才能添加新行。这可以通过简单地为Form2
创建一个新的构造函数来实现,该构造函数在签名中采用DataGridView
。下面的代码是如何从Form1
的btnAdd\u单击事件调用此新构造函数
private void btnAdd_Click(object sender, EventArgs e) {
Form2 f2 = new Form2(dataGridView1);
f2.ShowDialog();
}
现在我们需要在表单2中创建这个构造函数。由于新行在用户按下“添加/确定”按钮之前不会添加,因此我们需要保存构造函数传入的Fom1
的DataGridView
。因此,将创建一个全局DataGridView
变量parentDGV
。调用构造函数时,我们只需将parentDGV
设置为传入的DataGridView
。这将允许通过“添加”方法访问网格
DataGridView parentDGV;
public Form2(DataGridView dgv) {
parentDGV = dgv;
InitializeComponent();
}
由于我们现在可以访问Form1
的DataGridView
,您只需添加新行即可。未进行错误检查,因此文本框可能为空。下面是表单2
的“添加”按钮单击事件
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”,以允许从其他m
DataGridView parentDGV;
int editRowIndex;
public Form2(DataGridView dgv, int rowIndex) {
parentDGV = dgv;
editRowIndex = rowIndex;
InitializeComponent();
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
}
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();
}
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();
}
}
}
}
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();
}
}
}
}
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);
}
frmNewConfig f = new frmNewConfig();
if (f.ShowDialog() == DialogResult.OK)
{
Object c = new Object();
c = (Object)f.Tag;
_yourList.Add(c);
**example**
valueA = txtValueA.Text;
valueB = txtValueB.Text;
}
yourDGV.DataSource = typeof(Object);
//OR
yourDGV.DataSource = yourList;