gpt4 book ai didi

C# - 如何使用单击按钮将数据从 dataGridView1 传递到另一个?

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:40 25 4
gpt4 key购买 nike

我在一个表单中有一个 dataGridView1dataGridView2 和一个 ButtonAdd

用户将:

1- 选择任何一个“单元格”或“整行”。

2-选择多行

然后:

单击按钮时,所选数据将从 dataGridView1 移动到 dataGridView2。这就是我需要做的。

我的尝试:

经过多次搜索,我尝试了这个解决方案,它几乎完成了,但是有一个我无法处理的小问题:

完整代码:

private const string strconneciton = @"YourConnectionString";
SqlConnection con = new SqlConnection(strconneciton);
SqlCommand cmd = new SqlCommand();
DataTable dataTable;

private void loadDataIntoGridView1()
{
try
{
con.Open();
cmd.CommandText = "SELECT id, accNum, accName FROM Employees";
cmd.Connection = con;

SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;

dataTable = new DataTable();
adapter.Fill(dataTable);

BindingSource bSource = new BindingSource();
bSource.DataSource = dataTable;
dataGridView1.DataSource = bSource;

//i don't know if this line is useful...
dataGridView2.DataSource = dataTable.Clone();

adapter.Update(dataTable);
con.Close();

}
catch (Exception ed)
{
con.Close();
MessageBox.Show(ed.Message);
}
}//end loadDataIntoGridView1


private void buttonSend_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedCells.Count > 0)
{
foreach (DataGridViewCell oneCell in dataGridView1.SelectedCells)
{
if (oneCell.Selected)
{
//this should add the rows that is selected from dataGridView1 and,
//pass it to dataGridView2
var currentRow = ((DataRowView)dataGridView1.CurrentRow.DataBoundItem).Row;
((DataTable)dataGridView2.DataSource).ImportRow(currentRow);

//this will remove the rows you have selected from dataGridView1
dataGridView1.Rows.RemoveAt(oneCell.RowIndex);
}//end if
}//end foreach
}//end if
}//end button click

让我们调试:

在开始之前只需注意一件事:

  • 删除行(多行或单行)的方法在所有情况下都能正常工作。
  • 添加到 DGV2 的方法是问题所在,我是从 here 中获取的...选择单行而不是多行时效果很好。

1- 如果您选择了一个单元格/行,它将被成功添加和删除。

2- 如果您选择了多行,比如第一行和第二行,它会添加第二行和第三行,然后肯定会删除它们,但只会添加一个。为什么?!

因为这里

var currentRow = ((DataRowView)dataGridView1.CurrentRow.DataBoundItem).Row;
((DataTable)dataGridView2.DataSource).ImportRow(currentRow);

获取 DGV1 中现有行的当前索引并迭代到选择行的数量并将它们添加到 DGV2。

截图:

该过程如何完成的图像: image of how the process is done .

我需要做的: what i need to do

应该怎样做才能解决这个问题?

最佳答案

虽然 marco 有一点,但作为抛出的异常,行的所有权属于表。要绕过这个,你可能想这样做......

//根据您要创建的表创建一个新行//插入具有相同结构的 INTO

var copyRow = table.NewRow(); 
copyRow.ItemArray = currentRow.ItemArray;
table.Rows.Add( copyRow );

ItemArray 是按顺序排列的表的所有列属性的列表,没有显式引用 Row["someColumn"]。因此,将数组复制到新行可以获得所有列。这是 - 如果两个表结构相同 - 并且似乎来自您提供的场景。

澄清

上面的代码只做一行,将根据你的循环应用

if (oneCell.Selected)

您每行选择了多个列,从而导致您的循环有些困惑。您实际上多次点击同一行。无论如何,我发现您实际上是在 Windows 应用程序中执行此操作,而不是 WPF。我创建了一个表单并在下面发布了代码。

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
loadDataIntoGridView1();
}

public DataTable tblFrom { get; set; }
public DataTable tblTo { get; set; }
private void loadDataIntoGridView1()
{
tblFrom = new DataTable();
tblFrom.Columns.Add("Col1", typeof(string));
tblFrom.Columns.Add("Col2", typeof(string));

tblTo = tblFrom.Clone();

DataRow tmp;
while (tblFrom.Rows.Count < 20)
{
tmp = tblFrom.NewRow();
tmp["Col1"] = "my row " + tblFrom.Rows.Count;
tmp["Col2"] = "testing";
tblFrom.Rows.Add(tmp);
}

dataGridView1.AutoGenerateColumns = true;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView2.AutoGenerateColumns = true;
dataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.DataSource = tblFrom;
dataGridView2.DataSource = tblTo;
}

private void button1_Click(object sender, System.EventArgs e)
{
// if no ROWS selected, get out.
if (dataGridView1.SelectedRows.Count == 0)
return;

foreach( DataGridViewRow vr in dataGridView1.SelectedRows)
{
var currentRow = ((DataRowView)vr.DataBoundItem).Row;
((DataTable)dataGridView2.DataSource).ImportRow(currentRow);

//this will remove the rows you have selected from dataGridView1
dataGridView1.Rows.RemoveAt(vr.Index);
}
}
}

在这里,我有一个表格,其中有两个类似于您所拥有的网格和一个用于“移动”记录的按钮(但只有一个方向),您将必须调整一个/所有/从/到方向。

一些变化。我更改了网格以强制选择模式到整个行。这将防止单行有多个条目,因为您有多个可用列。通过在单元格之间拖动或按住 Ctrl 键并单击各个行,仍然可以进行多项选择。这允许选择不在同一可视屏幕区域内的行。

我也只是做了一个创建表来强制模拟 20 行数据以强制不是所有行都同时可见。

接下来是点击事件……如果没有选择行,退出……如果有,则循环,但如果多列,则每行执行一次,而不是多次。获取绑定(bind)数据行,导入删除...

否则你已经非常接近并且不需要复制数组。我认为总体问题是您的列模式选择多次击中同一条记录。在第一个单元格的第 0 行的 remove-at 之后,第 1 行成为第 0 行并因此复制它,删除并且您现在不在列表中,因为只剩下一个记录要处理。在这里,无论选择了其中的哪一列,我们都会一次性获取整行。

关于C# - 如何使用单击按钮将数据从 dataGridView1 传递到另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47454256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com