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