【问题标题】:Filling textboxes with DataGridView information用 DataGridView 信息填充文本框
【发布时间】:2025-11-27 15:10:02
【问题描述】:

我正在尝试通过表单(在 WinForms 中)更新数据库信息。 DataGridView 在 Form1 中显示数据库信息(其中还包含一个打开 Form2 的按钮(更新表单))。要更新信息,我必须在数据网格中选择要更新的行,然后单击按钮(打开 Form2)。当更新表单打开时,其中的文本框应填充 DataGridRows 信息。现在这是我被卡住的地方,文本框没有被填充(没有错误)。我做错了什么?

这是我正在使用的代码:

        MainForm getMainForm = new MainForm();

        private void EditMemberForm_Load(object sender, EventArgs e)
        {
            DataGridViewCell cell = null;

            foreach (DataGridViewCell selectedCell in getMainForm.MembersGridView.SelectedCells)
            {
                cell = selectedCell;
                break;
            }

            if (cell != null)
            {
                DataGridViewRow row = cell.OwningRow;

                EditFirstNameTextBox.Text = row.Cells["FirstNameColumn"].Value.ToString();
                EditLastNameTextBox.Text = row.Cells["LastNameColumn"].Value.ToString();
                EditPersonalIdTextBox.Text = row.Cells["PersonalIdColumn"].Value.ToString();
                EditCityComboBox.Text = row.Cells["CityColumn"].Value.ToString();
                EditPhoneNumberTextBox.Text = row.Cells["PhoneNumberColumn"].Value.ToString();
            }
        }

【问题讨论】:

    标签: c# winforms


    【解决方案1】:
    MainForm getMainForm = new MainForm();
    

    问题是您正在创建新的主窗体并尝试从新创建的主窗体中获取选定的行。

    当您创建EditMemberForm 时,您可以将值作为参数传递给EditMemberForm

    【讨论】:

    • 怎么做?当我在处理类时,我使用这个:class BLABLLA (SomeClass entity) 但是我应该如何在这里传递参数?
    • 您需要向EditMemberForm 添加一个构造函数,以便它接受DataGridViewDataGridViewRow。然后,根据您的需要,通过传递您的数据网格或选定的行来实例化它
    • 我已经想通了。我会在我的问题中留下一个便条。谢谢你:)
    【解决方案2】:

    当您单击按钮时,将您选择的对象从您的主窗体传递到 Form2,而不是创建一个新的 MainForm...

    例子:

    private void Form2Button_Click(object sender, EventArgs e){
      Form f=new Form2(dataGridView.SelectedRow);
      f.show();
    }
    

    在你的 Form2 构造函数中:

    object myRow;
    
    public Form2(object myRow){
      this.myRow=myRow
    }
    

    【讨论】:

    • 为什么建议使用object 类型?
    • 不要使用对象,当然要选择最合适的!它只是泛型类型
    【解决方案3】:

    我想通了。

    我在打开 UpdateForm(来自 MainForm)的按钮中使用了这段代码。

                    EditMemberForm getEditMemberForm = new EditMemberForm();
                    DataGridViewCell cell = null;                
    
                    foreach (DataGridViewCell selectedCell in MembersGridView.SelectedCells)
                    {
                        cell = selectedCell;
                        break;
                    }
    
                    if (cell != null)
                    {
                        DataGridViewRow row = cell.OwningRow;
    
                        getEditMemberForm.EditFirstNameTextBox.Text = row.Cells["FirstNameColumn"].Value.ToString();
                        getEditMemberForm.EditLastNameTextBox.Text = row.Cells["LastNameColumn"].Value.ToString();
                        getEditMemberForm.EditPersonalIdTextBox.Text = row.Cells["PersonalIdColumn"].Value.ToString();
                        getEditMemberForm.EditCityComboBox.Text = row.Cells["CityColumn"].Value.ToString();
                        getEditMemberForm.EditPhoneNumberTextBox.Text = row.Cells["PhoneNumberColumn"].Value.ToString();
                    }
    
                    getEditMemberForm.ShowDialog();
    

    这非常有效。感谢任何试图提供帮助的人,干杯:)!

    【讨论】:

      【解决方案4】:

      我最近遇到了类似的问题,我是这样解决的。

      表格1:

      public void NotifyMe(string s, string s2, string s3, string s4, string s5)
      {
          if (textBox1.InvokeRequired)
          {
              textBox1.Invoke((MethodInvoker)delegate { textBox1.Text = s; });
          }
          else
          {
              textBox1.Text = s;
          }
      
          //...
      }
      

      像这样从 Form1 打开 Form2:

      using (Form2 form = new Form2())
      {
           // passing this in ShowDialog will set the .Owner 
           // property of the child form
           form.ShowDialog(this);
      }
      

      表格2:

      parent = (Form1)this.Owner;
      parent.NotifyMe(s, s2, s3, s4, s5);
      

      【讨论】: