C#如何将选定的datagridview行的值从一个表单复制到另一个表单上的datagridview行?
我正在使用html敏捷包来获取网格视图的数据。我只是想使用列按钮复制一行以将其发送到另一个表单上的空白网格视图。没有数据绑定或SQL。在填充网格之后,我得到整个数据网格视图,而不用按列按钮。我的代码是:C#如何将选定的datagridview行的值从一个表单复制到另一个表单上的datagridview行?
表1和
private void LeadsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
Database DB = new Database(LeadsDataGridView.DataSource);
var senderGrid = (DataGridView)sender;
if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
{
DB.Row = LeadsDataGridView.CurrentRow;
}
Search_Table.AcceptChanges();
LeadsDataGridView.DataSource = Search_Table;
}
表2
public Database(object DataSource)
{
InitializeComponent();
InitDBTable();
DB_GridView.DataSource = DataSource;
}
这里有一个小例子,希望能得到你的方式。
MainWindow.xaml
<Window x:Class="PassingValuesFromFormToForm_45425412.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:PassingValuesFromFormToForm_45425412"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="61,60,0,0" VerticalAlignment="Top" Width="259"/>
<Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="29,13,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System.Collections.Generic;
using System.Windows;
namespace PassingValuesFromFormToForm_45425412
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
List<dgvEntry> dgvList = new List<dgvEntry>();
public MainWindow()
{
InitializeComponent();
dgvList.Add(new PassingValuesFromFormToForm_45425412.dgvEntry { col1 = "blah blah", col2 = "blehbleh" });
dataGrid.AutoGenerateColumns = true;
dataGrid.ItemsSource = dgvList;
}
private void button_Click(object sender, RoutedEventArgs e)
{
Window1 win1 = new Window1((dgvEntry)dataGrid.Items[0]);
win1.Show();
}
}
public class dgvEntry {
public string col1 { get; set; }
public string col2 { get; set; }
}
}
Window1.xaml
<Window x:Class="PassingValuesFromFormToForm_45425412.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:PassingValuesFromFormToForm_45425412"
mc:Ignorable="d"
Title="Window1" Height="300" Width="300">
<Grid>
<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="23,39,0,0" VerticalAlignment="Top" Width="181"/>
</Grid>
</Window>
Window1.xaml.cs
using System.Collections.Generic;
using System.Windows;
namespace PassingValuesFromFormToForm_45425412
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
public Window1(dgvEntry incomingItem)
{
InitializeComponent();
dataGrid.AutoGenerateColumns = true;
dataGrid.ItemsSource = new List<dgvEntry> { incomingItem };
}
}
}
这是WinForms的更新。再次,这是一个最小的例子。为了这个示例的目的,我在表单设计器中没有做任何事情。 一切是通过后面的代码完成的。
Form1.cs的
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
DataGridView dgv = new DataGridView();
BindingList<dgvitem> itemsList = new BindingList<dgvitem>();
bool SendAsRow = true;//just a variable to trigger the proper method in 'Dgv_CellContentClick'
Button independantButton = new Button();
public Form1()
{
InitializeComponent();
InitializeTheDGV();
AddTheButton();
itemsList.Add(new dgvitem { JustaTextField = "aksldjf sadfjasifuqw adsfasf" });
itemsList.Add(new dgvitem { JustaTextField = "qwerioqu aisdfnvmz, oaa"});
}
private void InitializeTheDGV()
{
dgv.Location = new Point(this.Location.X + 5, this.Location.Y + 5);
dgv.DataSource = itemsList;
dgv.AutoGenerateColumns = false;
this.Controls.Add(dgv);
dgv.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "My col header", Name="mycol1" });
dgv.Columns.Add(new DataGridViewButtonColumn() { HeaderText = "click in this column", Name = "mycol2" });
dgv.Columns["mycol1"].DataPropertyName = "JustaTextField";
dgv.CellContentClick += Dgv_CellContentClick;
}
private void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (!(sender is DataGridView))
{
return;
}
/*
* Experiment and Pick your poison
*/
if (SendAsRow)
{
Form2 f2r = new Form2(dgv.Rows[e.RowIndex]);
f2r.Show();
}
else
{
Form2 f2 = new Form2((string)dgv.Rows[e.RowIndex].Cells[0].FormattedValue);
f2.Show();
}
/**/
}
private void AddTheButton()
{
independantButton.Location = new Point(this.Location.X + 5, this.Location.Y + dgv2.Height + 15);
independantButton.Click += IndependantButton_Click;
this.Controls.Add(independantButton);
}
private void IndependantButton_Click(object sender, System.EventArgs e)
{
/*
* Experiment and Pick your poison
*/
if (SendAsRow)
{
Form2 f2r = new Form2(dgv.SelectedRows[0]);
f2r.Show();
}
else
{
Form2 f2 = new Form2((string)dgv.SelectedRows[0].Cells[0].FormattedValue);
f2.Show();
}
/**/
}
}
public class dgvitem
{
public string JustaTextField { get; set; }
}
}
Form2.cs
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form2 : Form
{
DataGridView dgv2 = new DataGridView();
BindingList<dgv2item> dgv2list = new BindingList<dgv2item>();
//this is the 'default' constructor which takes no argument
public Form2()
{
InitializeComponent();
MakeTheGrid();
}
//this form constructor takes a String parameter so you can pass only a string
public Form2(string incomingText)
{
InitializeComponent();
MakeTheGrid();
dgv2list.Add(new dgv2item { coolBeans = incomingText });//add the incoming String to the itemList, which will in-turn update the DataGridView
}
//this form constructor takes a DataGridViewRow parameter so you can pass the whole row
public Form2(DataGridViewRow incomingRow)
{
InitializeComponent();
MakeTheGrid();
dgv2list.Add(new dgv2item { coolBeans = (string)incomingRow.Cells[0].FormattedValue});//add the value of the cell you want out of the row to the itemlist, which will in-turn update the DataGridView
}
private void MakeTheGrid()
{
dgv2.Location = new Point(this.Location.X + 15, this.Location.Y + 15);//it has to go somewhere...
dgv2.AutoGenerateColumns = true;
dgv2.DataSource = dgv2list;//define where to find the data
this.Controls.Add(dgv2);//add it to the form
}
}
public class dgv2item
{
public string coolBeans { get; set; }
}
}
我喜欢你列出的blaze_125的例子。它帮助我看到你认为是我问题的要点背后的逻辑;我的程序代码与您的示例非常不同,我无法理解您的代码中发生了什么。我试图使用:DB_Table.Rows.Add(Search_Table.Rows [e.RowIndex]);作为收集行的手段,但是我得到一个错误,说“这行已经属于另一个表”我现在正在使用DataTable与DataSource。我会继续做一些研究并尝试找到解决方案。如果我碰到一些东西,我会在这里发布。 –
请在开始的帖子中跟进@ASh问题。标签和帖子的内容有些矛盾。我给了你一个WPF示例,但是,感觉你可能实际上正在使用Form而不是WPF。如果你确实在使用Forms,我会写出另一个答案。要了解您是否在WPF中工作,请查看Visual Studio中的解决方案资源管理器。如果你的解决方案资源管理器列出了“.xaml”文件,那么你在WPF项目中。如果您没有列出该文件扩展名,那么您可能在Forms中工作。 –
你是对的blaze_125,我为误会深表歉意。我使用了不正确的标签。你现在的代码对我来说实际上更有意义。为了回答ASh的问题,我使用带DataTable的DataGridView并在DataPile类中“设置”变量。运行搜索条件后,我将在DGV中生成数据。复制按钮位于DGV内作为列。我有一个单独的按钮来打开表单。我正在使用FullRowSelect进行选择模式。 –
[使用此方法应该正常工作(https://stackoverflow.com/questions/43923548/passing-值从 - 多文本框到字符串-ON-另一个外形或呼最VAL/43924222#43924222)。 SO帖子是关于传递一个String的,但是,只要你的方法期望你想传递的参数类型,就可以传递任何东西。 –
datagridview!= wpf datagrid!= gridview。你使用哪一个? – ASh
也许,它的问题太广泛了。如果只是简单地输入每列的值,那么如何将单个datagridview行的值复制到另一个datagridview? –