C# 来自另一表单上配置的DataGridView的数据

C# 来自另一表单上配置的DataGridView的数据,c#,datagridview,C#,Datagridview,我有一个Form1,它有一个dataGridView和一个向该网格添加内容的按钮。当选择这个按钮时,我调用Form2,它有两个文本框和一个组合框来填充名称、目录和格式(例如),再加上一个OK按钮将行添加到Form1上的dataGridView 当我回到Form1时,dataGridView必须显示输入的内容。我的网格有三列:名称、格式和一个按钮列,当单击它时,可以在Form2的屏幕上重新加载以前填充的信息,并在每个字段中重新加载,以便能够更改或只是查阅 首先,我尝试创建一个函数,通过参数将线添加

我有一个Form1,它有一个dataGridView和一个向该网格添加内容的按钮。当选择这个按钮时,我调用Form2,它有两个文本框和一个组合框来填充名称、目录和格式(例如),再加上一个OK按钮将行添加到Form1上的dataGridView

当我回到Form1时,dataGridView必须显示输入的内容。我的网格有三列:名称、格式和一个按钮列,当单击它时,可以在Form2的屏幕上重新加载以前填充的信息,并在每个字段中重新加载,以便能够更改或只是查阅

首先,我尝试创建一个函数,通过参数将线添加到我的网格中,如下代码所示:

欧盟表格1提供了数据网格视图,并提供了一个新的网格。所有成员国都有自己的格式,欧盟的格式为文本框和组合框,格式为格式,格式为格式(示例),格式为数据网格视图,格式为1

表格一

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;