2016-09-10 12 views
0

私は、4列のDatagridviewを生成する非常に単純なフォームを持っています。フォームの生成に問題はありません。最後の列のみを編集できます。編集後、OKボタンを押して、最後の列のリストの要素を文字列に結合します。 OKボタンのオブジェクト送信者の中で、そのリスト(現在)を利用できるようにするにはどうすればいいですか?私の貧弱な文法には申し訳ありません。私は明らかな初心者です。ありがとう。あるメソッドからローカル変数にアクセスして、フォーム上の別のメソッドを呼び出す

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

}

答えて

0

あなたは4つの列と結合していないDataGridViewを持っているし、で区切って4番目の列に値を連結したいです「|」方法はOK_button_Clickです。

foreachループを使用してDataGridViewの行コレクション内の各行を反復し、4番目の列(index = 3)の値を取得してこれを達成するか、Linqクエリを使用して反復を実行できます。

ここはLinqソリューションです。

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

動作しますが、空白のエントリを残したいと思います。このコードで状態を削除しようとしました。行(行)=>(!row.IsNewRow)).Select((row)=>(row.Cells [3])は、 .Value.ToString()))));しかし、セルが空白の場合は例外が発生します。私は間違って何をしていますか?ありがとう。 –

+0

@WayneLWaag、nullフィルタリングを削除する答えを更新しました。 – TnTinMn

+0

最初または最後の行が空白の場合を除いて動作します。ところで、それは有界です。常に67行あります。 –

0

フィールドレベルの変数であることをcurrentを移動するにはあまりにも難しいことではないだろうが、それが最良の選択肢ではありません。 C#でラムダが使用できるようになったので、基本的にイベントハンドラをインライン化してOK_button_Clickメソッドを完全に削除することができます。このようなカプセル化は、変数のアクセスレベルを上げるよりも堅牢なアプローチです。フィールドを使用して

はあなただけ誰もがアクセスするために、そのファイルを利用できるようにするだろうので、特定のニーズの誰かがあなたのコンピュータ上のファイルに書き込むというようなものです。あなたのコンピュータ上のファイルではそうしないでしょうから、あなたのコードでそれをするべきではありません。あなたは、メソッドのローカル変数にアクセスすることができラムダインサイド

。あなたのコードは次のようになります。

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

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

あなただけの今まで一旦Load_Tweakerを呼び出した場合、あなたのコードは非常に単純なことができます:あなたはよりLoad_Tweaker多くを呼び出す場合は、管理する必要があると、

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

しかし、各コールのハンドラの追加および削除もう少し複雑ですが、それほど悪くはありません。

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

は、単純なバージョンを試してみました。コンパイル済みですが、動作しませんでした。 「現在の」行の変更は、結合時には含まれませんでした。文字列は同じままです。どのようにして現在の「フィールドレベルの変数」にするのですか? –

+0

@WayneLWaag - 'String.Join'にブレークポイントを置き、コードが実行されているかどうかを確認します。それが私の最初のポーティングコールです。さもなければ 'private EventHandler okButtonClick = null;'と同じポイントで 'private List current = null; 'を定義し、現在現在定義している' List 'を削除してください。しかしそれは後退です。 – Enigmativity

関連する問題