C# 从其他表单更改DataGridView单元格的值
我有两张表格:C# 从其他表单更改DataGridView单元格的值,c#,winforms,datagridview,C#,Winforms,Datagridview,我有两张表格: Form1包含DataGridView控件 Form2包含Textbox控件(处于只读模式)、复选框和按钮 当我选择一个DataGridView行时,它将显示Form2并在文本框中显示它们的值。刚才一切似乎都好起来了。 我想知道的是,在文本框中显示数据后,我选中单选按钮,然后单击按钮,它将返回到所选行的Form1,并自动更改单元格4的值 这是我的代码: 表格1 private void dataGridView1_RowHeaderMouseDoubleClick(object
Form1
包含DataGridView
控件Form2
包含Textbox
控件(处于只读模式)、复选框和按钮DataGridView
行时,它将显示Form2并在文本框中显示它们的值。刚才一切似乎都好起来了。
我想知道的是,在文本框中显示数据后,我选中单选按钮,然后单击按钮,它将返回到所选行的Form1,并自动更改单元格4的值
这是我的代码:
表格1
private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
DataGridViewCell cell = null;
foreach (DataGridViewCell selectedCell in dataGridView1.SelectedCells)
{
cell = selectedCell;
break;
}
if (cell != null)
{
DataGridViewRow row = cell.OwningRow;
string objet = row.Cells[0].Value.ToString();
string objectif = row.Cells[1].Value.ToString();
string date = row.Cells[2].Value.ToString();
string commentaire = row.Cells[3].Value.ToString();
string client = row.Cells[5].Value.ToString();
string commercial = row.Cells[6].Value.ToString();
Détails_RDV détails = new Détails_RDV();
détails.obj = objet;
détails.objectif = objectif;
détails.date = date;
détails.comm = commentaire;
détails.clt = client;
détails.commer = commercial;
détails.Show();
}
}
表格2
如何执行此操作?您可以在子窗体上创建一个事件并触发它,如下例所示:
public partial class Détails_RDV : Form
{
public string obj;
public string objectif;
public string date;
public string comm;
public string clt;
public string commer;
**// Event fired on effectue checkbox change
public class EffectueEventArgs : EventArgs
{
public EffectueEventArgs(bool val)
{
Effectue = val;
}
public bool Effectue { get; private set; }
}
public delegate void EffectueChangeHandler(object src, EffectueEventArgs e);
public event EffectueChangeHandler OnEffectueChange;**
public Détails_RDV()
{
InitializeComponent();
}
private void Détails_RDV_Load(object sender, EventArgs e)
{
txtObjet.Text = obj;
txtObjectif.Text = objectif;
txtDate.Text = date;
txtCommerci.Text = commer;
txtClient.Text = clt;
txtCommentaire.Text = comm;
}
private void btnValider_Click(object sender, EventArgs e)
{
if (checkEffectue.Checked == true)
{
**// Notify any event listener of change
if (OnEffectueChange != null)
OnEffectueChange (this, new EffectueEventArgs(true);**
this.Close();
}
}
}
然后,当您创建子表单时,您可以订阅事件并注册适当的处理程序,例如
Détails_RDV détails = new Détails_RDV();
détails.obj = objet;
détails.objectif = objectif;
détails.date = date;
détails.comm = commentaire;
détails.clt = client;
détails.commer = commercial;
**détails.OnEffectueChange += (src, e) => { row.Cells[4].Value = e.Effectue; };**
détails.Show();
或者您可以利用INotifyPropertyChanged,或者确实指定显式回调委托、操作或函数。在
窗体2的按钮单击事件中,检查复选框是否选中,只需将对话框结果设置为确定
,否则将其设置为取消
:
if (checkBox1.Checked)
this.DialogResult = System.Windows.Forms.DialogResult.OK;
else
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
在Form1
中,使用ShowDialog
而不是Show
,检查结果是否为OK
,执行您需要的更新:
var f2 = new Form2();
//Set values
if(f2.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//Perform update here
}
这样,每个表单都有自己的职责,您可以在Form1
中编写与Form1
相关的代码,而无需在Form2
中编写它们 我看不出这样做有什么好处。我的问题不在对话结果上,这是你的决定。每个表单都有自己的职责,您可以在Form1
中编写与Form1
相关的代码,而无需在Form2
中编写。我相信当前的帖子回答了您的问题。但是,如果您需要有关表单之间交互的更多信息,您可能会发现这篇文章很有用:如果您对答案有任何疑问,或者您觉得它有用,请告诉我:)
var f2 = new Form2();
//Set values
if(f2.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//Perform update here
}