从一个方法访问局部变量和窗体上的不同方法

时间:2016-09-10 23:33:48

标签: c# .net

我有一个非常简单的表单,它生成一个包含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());
    }
}

}

2 个答案:

答案 0 :(得分:0)

current移动为字段级变量并不困难,但这不是最佳选择。既然C#在语言中有lambdas,你基本上可以内联事件处理程序并完全删除OK_button_Click方法。这种封装比仅使变量具有更高级别的访问权限更为强大。

使用字段就像是说某人特别需要写入您计算机上的文件,因此您只需让该文件可供所有人访问。您不会对计算机上的文件执行此操作,因此您不应该在代码中执行此操作。

在lambda中,您可以访问方法的局部变量。您的代码可能如下所示:

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

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

如果您只拨打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]);
    }
}

但是,如果您不止一次致电Load_Tweaker,则需要为每次通话管理添加和删除处理程序。它有点复杂,但也不算太差。

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

答案 1 :(得分:0)

您有一个包含四列的未绑定DataGridView,并希望连接第四列中的值,以&#34; |&#34;分隔。在OK_button_Click方法中。

您可以使用foreach循环迭代DataGridView的行集合中的每一行,并从第四列(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())));
}