【问题标题】:Data from a DataGridView Configured on Another Form来自另一个窗体上配置的 DataGridView 的数据
【发布时间】:2017-07-04 02:03:48
【问题描述】:

我有 Form1,它有一个 dataGridView 和一个用于向该网格添加内容的按钮。选择此按钮时,我调用form2,它有2个文本框和combobox填充名称,目录和格式(例如),加上OK按钮将行添加到Form1上的DataGridView。

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

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

Eu tenho o Form1 que possui uma dataGridView e um botão para adicionar conteúdos nessa Grid。 Ao selecionar esse botão, eu chamo o Form2 que possui 2 TextBox e um ComboBox para preencher o Nome, Diretório e Formato (por exemplo), além de um botão OK para 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);
}

但是,它最终无法正常工作,网格上什么也没有显示。所以我考虑创建一个具有名称、路径和格式方法(为每个获取和设置)的类,以将所有内容存储在对象列表中(我想就是这样,如果我错了,请原谅我,因为我是初学者) .或保存到数据集。但是后来我想,我在我的 Form2 中实例化了这个类并传递了字段中填写的值,但是,我在我的 Form1 中做什么呢?

我认为这一切都非常令人困惑,如果有人可以解释解决这种情况的更清晰的方法,我将不胜感激,并且由于我是初学者,请非常具体。

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

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

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

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

    大部分工作都可以在Form2 中完成。在“添加”或“编辑”两种情况下,Form2 至少需要来自Form1 的一项……那就是Form1DataGridView。以“添加”方法为例,需要Form1DataGridView 才能添加新行。这可以通过简单地为Form2 创建一个新的构造函数来实现,该构造函数在其签名中采用DataGridView。下面的代码是如何从Form1btnAdd_Click 事件中调用这个新的构造函数。

    private void btnAdd_Click(object sender, EventArgs e) {
      Form2 f2 = new Form2(dataGridView1);
      f2.ShowDialog();
    }
    

    现在我们需要在Form2 中创建这个构造函数。由于在用户按下“添加/确定”按钮之前不会添加新行,因此我们需要保存构造函数传入的Fom1DataGridView。因此创建了一个全局DataGridView 变量parentDGV。调用构造函数时,我们只需将parentDGV 设置为传入的DataGridView。这将允许在“添加”方法中访问网格。

    DataGridView parentDGV;
    
    public Form2(DataGridView dgv) {
      parentDGV = dgv;
      InitializeComponent();
    }
    

    由于我们现在可以访问Form1DataGridView,您可以简单地添加新行。没有进行错误检查,因此文本框可能为空。下面是Form2的“添加”按钮点击事件。

    private void btnAddToGrid_Click(object sender, EventArgs e) {
      parentDGV.Rows.Add(txtName.Text, txtFormat.Text);
    }
    

    这应该允许用户通过Form2 的“添加”按钮在Form1DataGridView 中添加新的数据行。

    接下来,我们需要注意DataGridView 每一行上的“编辑”按钮。如果您想使用相同的Form2 来编辑行,那么您将需要进行一些更改,因为它目前只会添加行。要使Form2 正常工作,它需要知道用户是否单击了Form1 上的“编辑”或“添加”按钮。实现此目的的一种方法是为Form2 创建另一个构造函数。这个构造函数显然需要Form1DataGridView,但也需要单击“编辑”按钮的“行”索引。这将为我们提供要编辑的行的行索引。我们可以创建一个全局的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();
    }
    

    最后,要注意的最后一部分是当用户在Form1DataGridview 中的某一行上单击“编辑”按钮时。为了处理这个问题,DataGridViewCellClick 事件被连接起来。一旦单击的单元格被确定为“编辑”按钮,我们只需使用适当的构造函数创建新的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 有两个文本框(txtNametxtFormat)用于“名称”和“格式”,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);
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试我的演示吗?

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

      【讨论】:

        【解决方案3】:

        此问题的快速解决方法是使用模式对话框并将信息标记/传递到 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 中创建一个列表实例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-12
          • 1970-01-01
          • 2018-01-29
          • 1970-01-01
          • 2017-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多