任何人都可以帮忙..?
我真的需要帮助,这里有两种形式[form1&窗口2]。我在每个表单中创建了datagridview(DGV)。现在我需要通过单击form2上的一个按钮将值从form2 datagridview传输/复制到form1 datagridview。
在form2中我写了这个..!
private void button1_Click(object sender, EventArgs e)
{
try
{
if (dataGridView1.RowCount != 0)
{
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
object[] items = new object[row.Cells.Count];
for (int i = 0; i < row.Cells.Count; i++)
items[i] = row.Cells[i].Value;
Form1 F1 = new Form1();
F1.Activate();
F1.dataGridView1.Rows.Add(items);
F1.dataGridView1.DataSource = items;
dataGridView1.Rows.Remove(row);
}
}
else
{
MessageBox.Show("There is no data to export, please verify..!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch { }
}
我得到的错误就像“...... dataGridView1.Form1由于其保护级别而无法访问”。是否有任何其他方法或方法可以将值从form2 datagridview导入到form1 datagridview ..?
任何想法......?
提前感谢。
答案 0 :(得分:2)
将Form1的DGV声明为Public而不是private,并在Form2中执行以下操作:
声明以下变量:
System.Windows.Forms.Form f = System.Windows.Forms.Application.OpenForms["Form1"];
。
在您的计划中执行以下更改:
private void button1_Click (object sender, EventArgs e)
{
try
{
if (dataGridView1.RowCount != 0)
{
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
((Form1)f).dataGridView1.Rows.Add(row);
}
}
else
{
MessageBox.Show("There is no data to export, please verify..!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch { } }
答案 1 :(得分:0)
您只需声明dataset/datatable
即可将form1
grid
绑定为公开,并在form2
中访问该datatable or dataset
。通过{{1}},您可以再次绑定form2上的网格。
或者您可以将数据集或数据表从form1发送到form2(可能通过模块化函数),然后绑定网格。
这是最简单的方法。
答案 2 :(得分:0)
您应该使用某种event
来实现此目的:
//the Form1 class
public partial class Form1 : Form {
Form2 f2 = new Form2();
public Form1(){
InitializeComponent();
f2.TransferSelectedRows += (s,e) => {
if (dataGridView1.RowCount > 0) {
foreach(DataGridViewRow row in dataGridView1.SelectedRows){
//add the selected row to the receiver grid
e.ReceiverGrid.Rows.Add(row.Cells.OfType<DataGridViewCell>()
.Select(cell=>cell.Value).ToArray());
//remove the selected row
dataGridView1.Rows.Remove(row);
}
e.HasRows = true;
} else {
e.HasRows = false;
}
};
}
}
//Form2 class
public partial class Form2 : Form {
public Form2() {
InitializeComponent();
}
public class TransferSelectedRowsEventArgs : EventArgs {
public DataGridView ReceiverGrid {get; private set;}
public bool HasRows {get;set;}
public TransferSelectedRowsEventArgs(DataGridView receiver){
ReceiverGrid = receiver;
}
}
public delegate void TransferSelectedRowsEventHandler(object sender, TransferSelectedRowsEventArgs e);
public event TransferSelectedRowsEventHandler TransferSelectedRows;
protected virtual void OnTransferSelectedRows(TransferSelectedRowsEventArgs e){
TransferSelectedRowsEventHandler handler = TransferSelectedRows;
if(handler != null) handler(this, e);
}
//Click event handler for button1
private void button1_Click(object sender, EventArgs e){
var transfer = new TransferSelectedRowsEventArgs(dataGridView1);
OnTransferSelectedRows(transfer);
if(!transfer.HasRows){
MessageBox.Show("There is no data to export, please verify..!", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
注意:我在上面发布的代码不完整,应添加一些您自己的成员或代码。您还应该考虑在网格中使用DataSource
,这就是我们在实际项目中处理DataGridView
的方式。
答案 3 :(得分:0)
在表单2中声明一个公共BindingList<row_object>
并从表单1中写入。如果表单1中的datagridview绑定到bindingList,则数据将自动刷新。请参阅this以查看如何将datagridview绑定到bindingList。