从其他表单更改DataGridView的单元格的值

时间:2016-06-24 10:59:27

标签: c# winforms datagridview

我有两种形式:

  1. Form1包含DataGridView次控件

  2. Form2包含Textbox个控件(模式只读),checkBox和Button。

  3. 当我选择一个DataGridView行时,它会显示Form2并在TextBoxes中显示它们的值。刚才一切似乎都好一些。 我想知道的是在文本框中显示数据后,我检查RadioButton,然后单击它将返回到所选行的Form1的按钮,并自动更改Cell 4的值

    这里有我的代码:

    Form1

    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;  
    
        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)  
            {  
               //What should I write here??
                 Liste_RDV lrdv = new Liste_RDV();
                 lrdv.Show();
    
            }  
        }  
    

    我该怎么做?

2 个答案:

答案 0 :(得分:1)

Form2上的按钮点击事件中,检查是否选中了复选框,只需将DialogResult设置为OK,否则将其设置为Cancel

if (checkBox1.Checked)
    this.DialogResult = System.Windows.Forms.DialogResult.OK;
else
    this.DialogResult = System.Windows.Forms.DialogResult.Cancel;        

Form1,而不是Show,使用ShowDialog并检查结果是否为OK,执行您需要的更新:

var f2 = new Form2();
//Set values
if(f2.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    //Perform update here
}

这样每个表单都有自己的责任,您可以在Form1中编写与Form1相关的代码,而不需要在Form2中编写它们。

答案 1 :(得分:0)

您可以在子表单上创建一个事件并触发它,如下例所示:

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,或者确实指定一个显式的回调委托,Action或Function。