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
不知道你这个问题是否已经解决, 如果还没有解决的话:添加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();//强行销毁
}
要在一个窗口中调用另一个窗口中的控件,可以通过以下步骤实现:
在要调用控件的窗口中,将该控件的属性Modifiers设置为public,使其对其他窗口可见。
在另一个窗口中,创建一个该控件所属类的实例,即先通过该控件所在窗口的类创建一个对象。如以下示例:
Form1 form1 = new Form1(); //创建Form1的实例 DataGridView dgv = form1.dataGridView1; //通过实例调用dataGridView1控件
此处调用的是名为dataGridView1的控件,若控件名称不同,需修改为相应名称。
dgv.Rows.Add(new object[] { "1", "Tom", 18 }); //向dataGridView1中添加行
此处演示向dataGridView1中添加一行数据,第一个参数为行内数据,需根据实际情况进行修改。
对于参考资料中的代码,如果要在Form1中调用DataGridView控件并将其中的数据保存为Excel表格文件,可以按照以下步骤进行:
在Form1中创建SaveButton的Click事件,在事件中添加参考资料中的代码进行保存。
在按下保存按钮时,先通过第二步中的方法获取DataGridView控件:
DataGridView dgv = this.dataGridView1; //获取Form1中的DataGridView控件