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

时间:2017-07-04 02:03:48

标签: c# datagridview

我有Form1,它有一个dataGridView和一个向该Grid添加内容的按钮。选择此按钮时,我调用Form2,它有2个TextBox和一个ComboBox来填充名称,目录和格式(例如),再加上一个OK按钮,将行添加到Form1上的dataGridView。

当我返回Form1时,dataGridView必须显示输入的内容。会发生什么是我的网格有三列:名称,格式和按钮列,当点击它时,重新加载Form2的屏幕,并在每个字段中再次加载先前填充的信息,以便能够更改或只是咨询。

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

Eu tenho o Form1 que possui uma dataGridView eummotãopraadicionarconteúdosnessaGrid。 Ao selecionaressebotão,eu chamo o Form2 que possui 2 TextBox e um ComboBox para preencher o Nome,DiretórioeFormato(por exemplo),alémdeumobotãoOKpara adicionar a linha a dataGridView na Form1。

表格1

public Form1()
{
    InitializeComponent();
}

public void AddRows(string name, string path)
{
    dataGridView1.Rows.Add(name, path);
    dataGridView1.Update();
}

表格2

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);
}

然而,它最终无法正常工作,在网格上没有显示任何内容。所以我想创建一个带有名称,路径和格式方法的类(为每个方法获取和设置)将所有内容存储在一个对象列表中(我认为就是这样,如果我错了,请原谅我因为我是初学者) 。或者保存到DataSet。但后来我想,我在Form2中实例化了类并传递了字段中填充的值,但是,我在Form1中该怎么办?

我认为这一切都非常混乱,如果有人能够解释一种更清晰的方法来解决这种情况,我会很感激,因为我是初学者,所以请非常具体。

3 个答案:

答案 0 :(得分:0)

你能试试我的演示吗?

    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;
    }
}

答案 1 :(得分:0)

目前还不清楚你想要实现的目标。看来你有两种形式。在表单(form1)上有一个DataGridView和一个Button来向网格添加新行。在第二个窗体(form2)上有两个文本框和一个组合框和一个“确定”按钮。我猜测文本框用于允许用户输入新的“名称”和“格式”数据。然后,当用户单击“确定”按钮时,文本框中的数据将添加到form1中DataGridView的新行。最后,DataGridView每行的“编辑”按钮允许用户打开SAME form2(用于添加新项目)并使用它来编辑用户单击的行。

我希望我能正确理解这一点。这是可行的,有很多方法可以实现这一目标。我只能假设有一些原因你不会直接在网格中“添加”或“编辑”这些单元格。 DataGridView“添加新行”或“编辑单元格”的默认行为已经实现,如果没有新的form2并且绝对没有代码可以实现相同的功能,则不需要form2来执行此操作需要。因此,我将假设您无法直接在网格中编辑单元格。拥有DataSource可能是一个原因(见下文)......

以下答案是实现这一目标的一种方法。如果DataSource DataGridView,我必须发出警告。但是,您可以使用此方法,只要下面的代码添加或编辑网格中的单元格,它就会通过直接访问网格单元格来实现。如果网格附加DataSource,则无效。如果有DataSource,那么当下面的代码添加或修改项目时,您需要更改代码以对DataSource执行这些添加/编辑操作,而不是网格本身。

大多数工作都可以在Form2完成。在“添加”或“修改”情况下,Form2至少需要Form1中的一个项目... Form1 DataGridView。使用“添加”方法作为示例,为了添加新行,需要Form1的{​​{1}}。这可以通过简单地为DataGridView创建一个在其签名中带有Form2的新构造函数来实现。以下代码是您如何从DataGridView的{​​{1}}事件中调用此新构造函数。

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的{​​{1}},因此您只需添加新行即可。没有进行错误检查,因此文本框可能为空。下面是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); } 添加新的数据行。

接下来,我们需要关注Form1每行的“编辑”按钮。如果要使用相同的DataGridView编辑行,则需要进行一些更改,因为它目前只会添加行。要使Form2正常工作,需要知道用户是否点击了DataGridView上的“修改”或“添加”按钮。实现此目的的一种方法是为Form2创建另一个构造函数。这个构造函数显然需要Form2的{​​{1}},但它还需要点击“编辑”按钮的“行”索引。这将为我们提供要编辑的行的行索引。我们可以创建一个全局Form1变量“editRowIndex”,以允许从Form2中的其他方法进行访问。

Form1

DataGridView方法通过在文本框中填入要编辑的数据对表单进行一些修改,将“添加”按钮文本更改为“更新”,更重要的是,更改按钮“单击”事件处理程序来更新网格中的行而不是添加新行。

int

以下是使用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 } 的{​​{1}}中的一行上的“修改”按钮时。为了解决此问题,EditClick的{​​{1}}事件已经连线。确定单击的单元格是“编辑”按钮后,我们只需使用正确的构造函数创建新的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();
}

我希望这是有道理的。将所有内容放在一起...使用“Designer”... Form1有一个DataGridview,其中包含两个文本框列(AName,Format)和一个第三个按钮列(编辑),可通过{{1}编辑行}。此外,DataGridView还有一个按钮,可以通过CellClick

“添加”新行
Form2

Form2:使用'Designer 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(); } } } } 有两个文本框(Form1DataGridView)代表“名称”和“格式”,Form2为“添加“信息作为新项目或”更新“网格中的一行。

Form1

答案 2 :(得分:0)

对此问题的快速解决方法是使用模式对话框并将信息标记/传递到Form1中的列表。

        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;
        }

现在,在Form1中,您应该有一种方法将列表绑定到DGV,例如:

yourDGV.DataSource = typeof(Object); 
   //OR
yourDGV.DataSource = yourList;

在尝试为其分配对象之前,不要忘记在frmLoad中创建列表实例。