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
    }