C#怎么在一个窗口里调用另一个窗口的控件?

form2里面有一个DataGridView,我想在form1里通过一些操作给这个DataGridView里添东西
我试过把这个控件设置成public的,不过不行。

你的窗体是模态的还是非模态的?
按理说,用public 虽然不优雅,但是对于非模态窗口,应该是可行的,你说不行,是什么错误提示?

1.窗体也是类,窗体间操作控件跟类间传值是一回事
2.你要在form2里操作form1里的控件,首先form1的控件必须是public的,其次form2必须使用form1当前显示的那个实例来操作,不要new一个新的
3.不必将控件public出来,这样不安全,耦合也太强,可以定义一个public的函数暴露给form2调用,通过参数传递

参考GPT和自己的思路:您可以使用以下代码将form2的DataGridView控件传递给form1并进行修改:

在form1中定义一个DataGridView变量:

private DataGridView dataGridViewFromForm2;

在form1打开form2时获取其DataGridView控件:

Form2 form2 = new Form2();
if (form2.ShowDialog() == DialogResult.OK)
{
    dataGridViewFromForm2 = form2.dataGridView1; // assuming DataGridView control in form2 is named dataGridView1
}

现在您可以在form1中使用dataGridViewFromForm2变量来访问并修改form2的DataGridView控件,例如:

dataGridViewFromForm2.Rows.Add("new row"); // add a new row to the DataGridView control in form2
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/391288
  • 你也可以参考下这篇文章:C# winform中的DataGridView的列宽设置(自动调整列宽)
  • 除此之外, 这篇博客: c# 从零创建winform窗体控件实现读取.dat文件数据、在dataGridView中显示数据、输出Excel文件中的 3 将显示在DataGirdView中的数据导出到Excel表格文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    添加Button控件。修改(Name)属性和Text属性。

     添加Click事件。

    在自动生成的Click事件是添加下面代码。

            private void saveButton_Click(object sender, EventArgs e) {
                //保存按钮,弹出对话框选择保存路径和文件名
                //验证是否有文件
                //弹出对话框浏览保存路径和文件名称
                string filePath = SearchBox1.Search_text.Text; //.dat文件地址
                string fileNameData = Path.GetFileNameWithoutExtension(filePath); //.dat文件名
                string fileName = fileNameData; //可以在这里设置默认文件名
                string saveFileName = ""; //文件保存名
                SaveFileDialog saveDialog = new SaveFileDialog(); //实例化文件对象
                saveDialog.DefaultExt = "xlsx";//文件默认扩展名
                saveDialog.Filter = "Excel文件|*.xlsx";//获取或设置当前文件名筛选器字符串,该字符串决定对话框的“另存为文件类型”或“文件类型”框中出现的选择内容。
                saveDialog.FileName = fileName;
                saveDialog.ShowDialog();//打开保存窗口给你选择路径和设置文件名
                saveFileName = saveDialog.FileName;
                if (saveFileName.IndexOf(":") < 0) return; //被点了取消
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
                if (xlApp == null) {
                    MessageBox.Show("无法创建Excel对象,您的电脑可能未安装Excel");
                    return;
                }
                Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;//Workbooks代表一个 Microsoft Excel 工作簿
                Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);//新建一个工作表。 新工作表将成为活动工作表。
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 
                                                                                                                                      //写入标题             
                for (int i = 0; i < dataGridView1.ColumnCount; i++)//遍历循环获取DataGridView标题
                { worksheet.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText; }// worksheet.Cells[1, i + 1]表示工作簿第一行第i+1列,Columns[i].HeaderText表示第i列的表头
                //写入数值
                for (int r = 0; r < dataGridView1.Rows.Count; r++)//这里表示数据的行标,dataGridView1.Rows.Count表示行数
                {
                    for (int i = 0; i < dataGridView1.ColumnCount; i++)//遍历r行的列数
                    {
                        worksheet.Cells[r + 2, i + 1] = dataGridView1.Rows[r].Cells[i].Value;//Cells[r + 2, i + 1]表示工作簿从第二行开始第一行保存为表头了,dataGridView1.Rows[r].Cells[i].Value获取列的r行i值
                    }
                    System.Windows.Forms.Application.DoEvents();//实时更新表格
                }
                worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
                MessageBox.Show(fileName + "资料保存成功", "提示", MessageBoxButtons.OK);//提示保存成功
                if (saveFileName != "")//saveFileName保存文件名不为空
                {
                    try {
                        workbook.Saved = true;//获取或设置一个值,该值指示工作簿自上次保存以来是否进行了更改
                        workbook.SaveCopyAs(saveFileName);  //fileSaved = true;将工作簿副本保存到文件中,但不修改内存中打开的工作簿                 
                    }
                    catch (Exception ex) {//fileSaved = false;                      
                        MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);
                    }
                }
                xlApp.Quit();
                GC.Collect();//强行销毁
            }
  • 您还可以看一下 王小科老师的零基础学C#编程—C#从小白到大咖课程中的 DataGridView控件的使用小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    要在一个窗口中调用另一个窗口中的控件,可以通过以下步骤实现:

    1. 在要调用控件的窗口中,将该控件的属性Modifiers设置为public,使其对其他窗口可见。

    2. 在另一个窗口中,创建一个该控件所属类的实例,即先通过该控件所在窗口的类创建一个对象。如以下示例:

    Form1 form1 = new Form1(); //创建Form1的实例 DataGridView dgv = form1.dataGridView1; //通过实例调用dataGridView1控件

    此处调用的是名为dataGridView1的控件,若控件名称不同,需修改为相应名称。

    1. 然后就可以通过该实例来使用该控件,如以下示例:

    dgv.Rows.Add(new object[] { "1", "Tom", 18 }); //向dataGridView1中添加行

    此处演示向dataGridView1中添加一行数据,第一个参数为行内数据,需根据实际情况进行修改。

    对于参考资料中的代码,如果要在Form1中调用DataGridView控件并将其中的数据保存为Excel表格文件,可以按照以下步骤进行:

    1. 在Form1中创建SaveButton的Click事件,在事件中添加参考资料中的代码进行保存。

    2. 在按下保存按钮时,先通过第二步中的方法获取DataGridView控件:

    DataGridView dgv = this.dataGridView1; //获取Form1中的DataGridView控件

    1. 然后将DataGridView中的数据按照参考资料中的代码进行保存即可。其中需要注意的是,dataGridView1.Columns[i].HeaderText表示第i列的表头,dataGridView1.Rows[r].Cells[i].Value表示第r行i列的值。格式应按照Excel表格的格式进行保存。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^