2016-09-10 1 views
0

Ich habe eine sehr einfache Form, die eine Datagridview mit 4 Spalten erzeugt. Kein Problem, das Formular zu generieren. Nur die letzte Spalte kann bearbeitet werden. Nach dem Bearbeiten möchte ich die OK-Schaltfläche drücken und Elemente der Liste in der letzten Spalte zu einer Zeichenfolge hinzufügen. Wie stelle ich diese Liste (aktuell) innerhalb des OK-Button-Objekt-Absenders zur Verfügung? Entschuldigung für meine schlechte Grammatik. Ich bin ein offensichtlicher Neuling. Vielen Dank.Zugriff auf eine lokale Variable von einer Methode eine andere Methode auf einem Formular

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 

namespace Avisynth_Script 
{ 
public partial class Form4 : Form 
{ 
    public Form4() 
    { 
     InitializeComponent(); 
    } 
    public string current_values = null; 

    private void Load_Tweaker(object sender, EventArgs e) 
    { 
     string[] deshake_parts = EntryPoint.deshakeSettings.Split(','); 
     List<String> settings = new List<string>(deshake_parts); 
     string[] default_values = EntryPoint.deshakeDefaultValues.Split(','); 
     List<String> defaults = new List<string>(default_values); 
     string[] current_settings = current_values.Split('|'); 
     //current_settings[0] = current_settings[0].Substring(1); 
     //current_settings[66] = current_settings[66].Substring(0, 6); 
     List<String> current = new List<string>(current_settings); 

     dataGridView1.Rows.Clear(); 
     for (int i=0; i < settings.Count; i++) 
     { 
      dataGridView1.Rows.Add(i+1 ,settings[i], defaults[i], current[i]); 
     }    
    }  

    private void OK_button_Click(object sender, EventArgs e) 
    { 
     EntryPoint.deshaker_param = string.Join('|', current.ToArray()); 
    } 
} 

}

Antwort

0

Sie haben eine ungebundenen DataGridView mit vier Spalten und wollen die Werte in dem vierten Spalte durch eine getrennt verketten „|“ in der OK_button_Click Methode.

Sie könnten eine foreach-Schleife verwenden, um jede Zeile in der Zeilensammlung DataGridView zu iterieren und den Wert aus der vierten Spalte (index = 3) zu ziehen, oder Sie können eine Linq-Abfrage zum Ausführen der Iteration verwenden.

Hier ist eine Linq-Lösung.

private void OK_button_Click(object sender, EventArgs e) 
{ 
    EntryPoint.deshaker_param = string.Join("|", dataGridView1.Rows.Cast<DataGridViewRow>().Where(row => (!row.IsNewRow)).Select(row =>((row.Cells[3].Value ?? string.Empty).ToString()))); 
} 
+0

Funktioniert, aber ich wollte Einträge, die leer sind, behalten. Ich habe versucht, die Bedingung mit diesem Code zu entfernen. updated_values ​​= string.Join ("|", dataGridView1.Rows.Cast (). Wobei ((row) => (! row.IsNewRow)) .Wählen Sie ((row) => (row.Cells [3] .Value.ToString()))); Wenn Zellen jedoch leer sind, erhalte ich eine Ausnahme. Was mache ich falsch? Vielen Dank. –

+0

@WayneLWaag, habe ich die Antwort aktualisiert, um Null-Filterung zu entfernen. – TnTinMn

+0

Funktioniert, außer wenn die erste oder letzte Zeile leer ist. Übrigens ist es begrenzt. Es gibt immer 67 Zeilen. –

0

Es wäre nicht allzu schwierig sein current zu bewegen ein Feldebene variabel zu sein, aber das ist nicht die beste Option. Jetzt, da C# Lambda in der Sprache hat, können Sie den Event-Handler grundsätzlich inline einfügen und die Methode OK_button_Click vollständig entfernen. Diese Art der Kapselung ist ein robusterer Ansatz als nur, dass Ihre Variablen eine höhere Zugriffsebene haben.

Die Verwendung eines Felds ist so, als würde jemand sagen, dass jemand in eine Datei auf Ihrem Computer schreiben muss, damit Sie diese Datei für jeden zugänglich machen können. Sie würden das nicht mit Ihren Dateien auf Ihrem Computer machen, also sollten Sie das nicht in Ihrem Code tun.

In einem Lambda können Sie auf die lokalen Variablen der Methode zugreifen. Sie Code kann wie folgt aussehen:

List<String> current = new List<string>(current_settings); 

    OK_button.Click += (s, e2) => 
    { 
     EntryPoint.deshaker_param = string.Join("|", current.ToArray()); 
    }; 

Wenn Sie jemals nur Load_Tweaker rufen einmal dann können Sie Ihren Code sehr einfach:

private void Load_Tweaker(object sender, EventArgs e) 
{ 
    string[] deshake_parts = EntryPoint.deshakeSettings.Split(','); 
    List<String> settings = new List<string>(deshake_parts); 
    string[] default_values = EntryPoint.deshakeDefaultValues.Split(','); 
    List<String> defaults = new List<string>(default_values); 
    string[] current_settings = current_values.Split('|'); 
    //current_settings[0] = current_settings[0].Substring(1); 
    //current_settings[66] = current_settings[66].Substring(0, 6); 
    List<String> current = new List<string>(current_settings); 

    OK_button.Click += (s, e2) => 
    { 
     EntryPoint.deshaker_param = string.Join("|", current.ToArray()); 
    }; 

    dataGridView1.Rows.Clear(); 
    for (int i = 0; i < settings.Count; i++) 
    { 
     dataGridView1.Rows.Add(i + 1, settings[i], defaults[i], current[i]); 
    } 
} 

Wenn Sie jedoch Load_Tweaker mehr nennen als wenn Sie die Notwendigkeit verwalten Hinzufügen und Entfernen des Handlers für jeden Anruf. Es ist ein wenig komplizierter, aber nicht so schlecht.

private EventHandler okButtonClick = null; 

private void Load_Tweaker(object sender, EventArgs e) 
{ 
    string[] deshake_parts = EntryPoint.deshakeSettings.Split(','); 
    List<String> settings = new List<string>(deshake_parts); 
    string[] default_values = EntryPoint.deshakeDefaultValues.Split(','); 
    List<String> defaults = new List<string>(default_values); 
    string[] current_settings = current_values.Split('|'); 
    //current_settings[0] = current_settings[0].Substring(1); 
    //current_settings[66] = current_settings[66].Substring(0, 6); 
    List<String> current = new List<string>(current_settings); 

    if (okButtonClick != null) 
    { 
     OK_button.Click -= okButtonClick; 
    } 

    okButtonClick = (s, e2) => 
    { 
     EntryPoint.deshaker_param = string.Join("|", current.ToArray()); 
    }; 

    OK_button.Click += okButtonClick; 

    dataGridView1.Rows.Clear(); 
    for (int i = 0; i < settings.Count; i++) 
    { 
     dataGridView1.Rows.Add(i + 1, settings[i], defaults[i], current[i]); 
    } 
} 
+0

Versucht die einfache Version. Kompiliert OK, aber es hat nicht funktioniert. Änderungen an den Zeilen in "aktuell" wurden beim Verbinden nicht berücksichtigt. Die Saite blieb gleich. Wie würden Sie eine "Feldebenevariable" machen? –

+0

@WayneLWaag - Setzen Sie einen Break-Point auf die 'String.Join' und sehen Sie, ob der Code ausgeführt wird. Das wäre meine erste Anlaufstelle. Ansonsten definiere einfach 'private Liste current = null;' an der gleichen Stelle, an der 'private EventHandler okButtonClick = null;' ist und entferne 'List ' wo du aktuell definierst. Aber das ist eine Rückwärtsbewegung. – Enigmativity

Verwandte Themen