2017-08-10 5 views
0

In diesem Schülerverzeichnis von mir habe ich ein Listenfeld im Hauptformular und in meiner zweiten Form habe ich Student hinzugefügt. In dieser zweiten Form füge ich dem Namen Textfeld und den Zahlen für den Schüler einen Namen hinzu, die durch Rohrzeichen ("|") getrennt werden müssen. Nachdem der Name und die Zahlen in den Textfeldern ausgefüllt sind, wenn der Benutzer den OK-Knopf drückt, sollte er wie die hartcodierten Schüler unten aussehen. Code untenSo übertragen Sie Informationen aus Textfeldern in ein Listenfeld in einem anderen Formular

erste Form

private void listForm1_SelectedIndexChanged(object sender, EventArgs e) 
     { 


      string val = listForm1.GetItemText(listForm1.SelectedItem); 



      string[] valArray = val.Split('|'); 

      int sum = 0; 
      int scores = 0; 


      for (int i = 1; i < valArray.Length; i++) 
      { 
       int num = Convert.ToInt32(valArray[i]); 
       sum += num; 
       scores++; 
      } 


      int average = sum/scores; 


      txtAverage.Text = average.ToString(); 
      txtTotal.Text = sum.ToString(); 
      txtScoreCount.Text = scores.ToString(); 
     } 


     private void Form1_Load(object sender, EventArgs e) 

     { 

      listForm1.Items.Add("Hamish Overtone" + "|" + 39 + "|" + 12 + "|" + 85); 
      listForm1.Items.Add("Claudia Dye" + "|" + 44 + "|" + 56 + "|" + 85); 
      listForm1.Items.Add("Mike Layne" + "|" + 12 + "|" + 47+ "|" + 28); 

     } 

zweite Form

private void btnADDSCORE_Click(object sender, EventArgs e) 
     { 


      string userInput = txtNewScore.Text; 

      txtNewScores.Text = txtNewScores.Text + " " + userInput; 

      txtNewScore.Text = String.Empty; 


     } 
      private void btnNewOk_Click(object sender, EventArgs e) 
     { 

     } 

     private void txtNewName_TextChanged(object sender, EventArgs e) 
     { 

     } 
    } 
ERRORING PART: 

private void listForm1_SelectedIndexChanged (object sender, EventArgs e) {

// Get the value from the selected item 
    string val = listForm1.GetItemText(listForm1.SelectedItem); 


    // Split the item's value to a string array according to the pipe char 
    string[] valArray = val.Split('|'); 

    int sum = 0; 
    int scores = 0; 

    // Iterate through all possible values and sum it up, 
    // while keeping count to how many numbers there are: 
    for (int i = 1; i < valArray.Length; i++) 
    { 
     int num = Convert.ToInt32(valArray[i]); 
     sum += num; 
     scores++; 
    } 

    // Calculate the average. 
    // Keep in mind using an integer will create a whole number, without decimal points.   
    int average = sum/scores; 

    // Place the average and the sum in textboxes 
    txtAverage.Text = average.ToString(); 
    txtTotal.Text = sum.ToString(); 
    txtScoreCount.Text = scores.ToString(); 
} 
+0

Wenn ich erhalte dieses Recht, Ihr Hauptformular, das ein Listenfeld hat öffnet die zweite Form auf, und dort, sobald Sie Daten eingegeben haben und auf OK klicken, möchten Sie diese Daten zurück zum Hauptformular übertragen? Ist das Ihre Anforderung? – Sach

+0

Ja, also gibt es in meiner Hauptform ein Listenfeld mit den drei hartcodierten Schülern. Wenn Sie einen neuen Schüler hinzufügen, öffnet sich das zweite Formular mit einem Namensfeld und einem Nummernfeld. Sobald das Formular ausgefüllt ist und der Benutzer die OK-Taste drückt, wird der Schüler in das Listenfeld von form1 übertragen. – User3283827

+0

All diese Informationen sind für diese Frage unnötig. Was Sie brauchen, ist, wie Sie Daten zwischen zwei Fenstern übertragen. Sie sollten zuerst herausfinden, was Ihre Frage ist. Außerdem, wenn Sie hier gegoogelt oder gesucht haben, gibt es eine Menge Fragen wie diese. – Sach

Antwort

0

Versuchen Sie, eine Schaltfläche hinzuzufügen, und verwenden Sie den folgenden Code (in der Klasse form1) zu seinem Click-Ereignishandler.

class form1 
{ 
    private void form1_addButton_Click(object sender, EventArgs e) 
    { 
     Form2 newForm = new Form2(); 
     newForm.ShowDialog(); 

     foreach(string s in newForm.studentInfo) 
     { 
      listForm1.Items.Add(s); 
     } 
    } 
} 

Der folgende Code würde zu Ihrer form2-Klassendatei hinzugefügt werden.

class form2 
{ 
    public List<string> studentInfo {get; set;} //add this to form2 

    private void form2_addButton_Click(object sender, EventArgs e) 
    { 


     //add scores to list here. 

    } 

} 

bearbeiten

//THIS IS IN FORM2 :) 
private void btnNewOk_Click(object sender, EventArgs e) 
{ 
    string student = textBoxName.Text; 
    string[] scores = textBoxNewScores.Text.Trim().Split(' '); 

    for(int i = 0; i < scores.Length; i++) 
    { 
     student = student + "|" + scores[i]; 
    } 
    studentInfo.Add(student); 
    this.Close(); 
} 

bearbeiten 2

private void listForm1_SelectedIndexChanged(object sender, EventArgs e) 
{ 


    string val = listForm1.GetItemText(listForm1.SelectedItem); 



    string[] valArray = val.Split('|'); 

    int sum = 0; 
    int scores = 0; 


    for (int i = 1; i < valArray.Length; i++) 
    { 
     int num = Convert.ToInt32(valArray[i]); 
     sum += num; 
     scores++; 
    } 


    int average = 0; 

    if (scores != 0) 
     average = sum/scores; 


    txtAverage.Text = average.ToString(); 
    txtTotal.Text = sum.ToString(); 
    txtScoreCount.Text = scores.ToString(); 
} 
1

In Ihrem Hauptfenster (Form1 hier), möchten Sie einen Delegaten erstellen, mit dem Sie Daten übergeben können, sa y, eine Zeichenfolge. Dann erstellen Sie eine Instanz dieses Delegattyps und abonnieren eine übereinstimmende Methode. Wenn Sie dann Ihr sekundäres Fenster öffnen, übergeben Sie diesen Delegaten an Ihr sekundäres Fenster.

public delegate void DataTransfer(string data); 

public partial class Form1 : Form 
{ 
    public DataTransfer transferDelegate; 

    public Form1() 
    { 
     InitializeComponent(); 
     transferDelegate += new DataTransfer(DataMethod); 
    } 

    public void DataMethod(string data) 
    { 
     // Do what you want with your data. 
     MessageBox.Show(data); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     InputWindow win = new InputWindow(transferDelegate); 
     win.Show(); 
    } 
} 

Nun, wenn Sie diese Delegaten in Ihrem sekundären Fenster aufzurufen, wird die DataMethod() Ihre Form1 genannt, und so können Sie Informationen zwischen den Fenstern passieren.

Ihre sekundäre Fenster Implementierung sollte wie folgt aussehen:

public partial class InputWindow : Form 
{ 
    DataTransfer transferDel; 

    public InputWindow(DataTransfer del) 
    { 
     InitializeComponent(); 
     transferDel = del; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     string data = textBox1.Text; 
     transferDel.Invoke(data); 
    } 
} 

Wie Sie sehen können, wenn Sie den Delegaten aufrufen, die verabschiedet wurde, ruft die entsprechende Methode in Ihrem Hauptprogramm, das Form1 ist.

+0

Scheint sehr verwirrend – User3283827

+0

Es ist _nicht_ verwirrend. Bitte lesen Sie mehr über Delegaten und wie Daten zwischen Fenstern übertragen werden. Dies ist die richtige (oder eine der richtigen) Art, es zu tun.Sobald Sie lernen, wie es funktioniert, ist es wirklich sehr einfach und nützlich. – Sach

+0

Ich bin sehr, sehr neu in C# wie super neu So versuchen versuchen, dies zu reproduzieren scheint unmöglich, ich lerne besser, wenn ich eine Antwort zu rezitieren immer wieder zu erinnern, für immer nach oder wenn die Situation wiederkommt – User3283827

Verwandte Themen