2016-06-24 6 views
3

Ich habe 2 Formen:von anderen Formular

  1. Form1 enthält DataGridView Kontrollen

  2. Form2 enthält Textbox Kontrollen, checkBox und Button (im Modus nur lesen).

Wenn ich eine DataGridView Row auswählen, wird es mir Form2 zeigen und ihre Werte in Textfelder anzuzeigen. Alles scheint jetzt besser. Was ich wissen will, ist nach dem Anzeigen von Daten in Textfeldern, ich überprüfe das RadioButton, dann klicken Sie auf die Schaltfläche, um zu Form1 der ausgewählten Zeile zurückzukehren und Ändern Sie den Wert von Zelle 4 automatisch.

Hier ist mein Code:

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(); 

     } 
    } 

Form2

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(); 

     } 
    } 

Wie kann ich das tun?

Antwort

0

Sie könnten ein Ereignis auf der Unterform erstellen und Feuer, wie im Beispiel unten:

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(); 
     } 
    } 
} 

Dann, wenn Sie die Unterform erstellen youc ein auf das Ereignis abonnieren und einen entsprechenden Handler registrieren , z.B

 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(); 

Oder Sie könnten INotifyPropertyChanged nutzen oder auch eine explizite Rückruf delegieren, Aktion oder Funktion angeben.

1

In der Schaltfläche Click-Ereignis auf Form2, ob das Kontrollkästchen aktiviert ist, stellen nur DialogResult-OK, setzen ich es sonst Cancel:

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

In Form1 statt Show, verwenden ShowDialog und Scheck wenn das Ergebnis OK ist, führen Sie das Update, das Sie brauchen:

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

Auf diese Weise jede Form seine eigene Verantwortung hat, und Sie Schreiben Sie die Codes, die sich auf Form1 in Form1 beziehen, und Sie müssen sie in Form2 nicht schreiben.

+0

Ich sehe nicht den Vorteil, das zu tun. Mein Problem ist nicht in ** DialogResult ** –

+0

Es ist deine Entscheidung. Dieses Formular hat seine eigene Verantwortung und Sie schreiben die Codes, die sich auf 'Form1' in' Form1' beziehen und Sie brauchen sie nicht in 'Form2' zu schreiben. –

+0

Ich glaube, der aktuelle Beitrag beantwortet Ihre Frage. Wenn Sie jedoch weitere Informationen zur Interaktion zwischen Formularen benötigen, ist dieser Beitrag möglicherweise hilfreich: [Interaktion zwischen Formularen - So ändern Sie ein Steuerelement eines Formulars aus einem anderen Formular?] (Https://stackoverflow.com/questions/38768737/interaction -zwischen-Formen-wie-um-eine-Kontrolle-einer-Form-von-einer-anderen-Form zu ändern) –

Verwandte Themen