我正在尝试构建一个通用的自定义选择器表单。根据类构造函数的不同,它应该返回单个值或值列表。
public partial class DGV_Select_Multiple : Form
{
public bool Answered { get; set; } = false; // Indicates if user picked something
public string Result { get; set; } = ""; // Single picked result
public List<string> Result_List { get; set; } = new List<string>(); // Multiple picked results
public List<string> Default_List { get; set; } = new List<string>(); // Default highlighted values
private bool MultipleSelection { get; set; } = false; // Flag of single/multiple selection allowed
public DGV_Select_Multiple(IEnumerable<string> List, string Default)
{
// Default value is a single string => single selection available only
InitializeComponent();
this.MultipleSelection = false;
this.Default_List = new List<string> { Default };
b_confirm.Click += delegate { ConfirmSelection(); };
b_cancel.Click += delegate { this.Close(); };
}
public DGV_Select_Multiple(IEnumerable<string> List, List<string> Default_List)
{
// Default is a List<string> => multiple selections are available
InitializeComponent();
this.MultipleSelection = true;
this.Default_List = Default_List;
b_confirm.Click += delegate { ConfirmSelection(); };
b_cancel.Click += delegate { this.Close(); };
}
private void ConfirmSelection()
{
this.Answered = true;
if (MultipleSelection)
{
Result_List = new List<string> { "value1", "value2" };
}
else
{
Result = "some single string";
}
}
}每次使用这样一个冗余操作所需的类返回值:
bool Answered = false;
string Result = "";
var AskForm = new DGV_Select_Multiple(new List<string> { "v1", "v2" }, "");
AskForm.Show();
if (AskForm.Answered)
{
Result = AskForm.Result;
}我尝试在类构造函数中使用ref字符串,但最终没有改变。有任何方法可以简化上面的构造函数吗?
string Result = new DGV_Select_Multiple(new List<string> { "v1", "v2" }, "").Result;或者类似的东西。感谢你的任何帮助
发布于 2020-11-18 08:39:54
将逻辑移到静态工厂方法中。因为您有两个返回类型,所以需要两个方法,但它们可以有相同的名称。
class DGV_Select_Multiple
{
public static List<string> Show(List<string> list, List<string> defaultList)
{
var f = New DGV_Select_Multiple(list, defaultList);
f.Show();
return f.Answered ? f.Result as string : null;
}
public static string Show(List<string> list, string defaultString)
{
var f = New DGV_Select_Multiple(list, defaultString);
f.Show();
return f.Answered ? f.Result as List<string> : null;
}
//Etc....现在,当您需要使用该表单时,只需编写:
string result= DGV_Select_Multiple.Show(new List<string> { "v1", "v2" }, "");或
List<string> result= DGV_Select_Multiple.Show(new List<string> { "v1", "v2" }, new List<string> { "" });发布于 2020-11-18 10:13:09
名为DGV_Select_Multiple的表单用于选择单个字符串值或多个字符串值,其中包括:
DataGridView DGV;
Label lb_Question;
Button b_confirm;
Button b_cancel;完整的表单代码如下:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace Sample
{
public partial class DGV_Select_Multiple : Form
{
public bool Answered { get; set; } = false;
public string Result { get; set; } = "";
public List<string> Result_List { get; set; } = new List<string>();
public List<string> Default_List { get; set; } = new List<string>();
private bool MultipleSelection { get; set; } = false;
public DGV_Select_Multiple(string Text, IEnumerable<string> List, string Default)
{
InitializeComponent();
lb_Question.Text = Text;
if (!string.IsNullOrWhiteSpace(Default)) this.Default_List = new List<string> { Default };
#region Bind single selection
MultipleSelection = false;
DGV.Columns.Add("Value", "Value");
DGV.Columns[0].Width = DGV.Width - 22;
DGV.MultiSelect = false;
foreach (string str in List)
{
DGV.Rows.Add(str);
}
DGV.ClearSelection();
#endregion
b_confirm.Click += delegate { ConfirmSelection(); };
b_cancel.Click += delegate { this.Close(); };
}
public DGV_Select_Multiple(string Text, IEnumerable<string> List, List<string> Default_List)
{
InitializeComponent();
lb_Question.Text = Text;
if (Default_List != null) this.Default_List = Default_List;
#region Bind multiple selection
MultipleSelection = true;
DGV.Columns.Add("Value", "Значение");
DGV.Columns.Add("Selected", "V");
DGV.Columns["Selected"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
DGV.Columns[1].Width = 30;
DGV.Columns[0].Width = DGV.Width - 30 - 22;
foreach (string str in List)
{
DGV.Rows.Add(str);
}
DGV.ClearSelection();
foreach (DataGridViewColumn Col in DGV.Columns)
{
Col.SortMode = DataGridViewColumnSortMode.NotSortable;
}
#endregion
DGV.SelectionChanged += delegate
{
if (MultipleSelection)
{
try
{
if ((DGV.SelectedCells != null && DGV.SelectedCells.Count != 0) || (DGV.SelectedRows != null && DGV.SelectedRows.Count != 0))
{
int Row = DGV.SelectedCells[0].RowIndex;
int Col = DGV.SelectedCells[0].ColumnIndex;
if (Row >= 0 && Col >= 0)
{
if (DGV.Rows[Row].Cells["Selected"].Value == null || DGV.Rows[Row].Cells["Selected"].Value == DBNull.Value || string.IsNullOrWhiteSpace(DGV.Rows[Row].Cells["Selected"].Value.ToString()))
{
DGV.Rows[Row].Cells["Selected"].Value = "V";
DGV.Rows[Row].DefaultCellStyle.BackColor = Color.LightGreen;
}
else
{
DGV.Rows[Row].Cells["Selected"].Value = "";
DGV.Rows[Row].DefaultCellStyle.BackColor = SystemColors.Window;
}
DGV.ClearSelection();
DGV.Refresh();
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
}
};
DGV.ColumnHeaderMouseClick += delegate (object sender, DataGridViewCellMouseEventArgs e)
{
try
{
if (DGV.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewCheckBoxColumn) || DGV.Columns[e.ColumnIndex].Name == "Selected")
{
if (DGV.Rows.Count != 0)
{
bool check = (DGV.Rows.Cast<DataGridViewRow>().Where(x => x.Cells["Selected"].Value.ToString() != "V").Count() != 0);
foreach (DataGridViewRow DGVRow in DGV.Rows)
{
DGVRow.Cells["Selected"].Value = (check ? "V" : "");
DGVRow.DefaultCellStyle.BackColor = check ? Color.LightGreen : SystemColors.Window;
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
};
b_confirm.Click += delegate { ConfirmSelection(); };
b_cancel.Click += delegate { this.Close(); };
}
private void DGV_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (!MultipleSelection)
{
if (e.Clicks == 2 && e.RowIndex >= 0 && e.ColumnIndex >= 0)
{
ConfirmSelection();
}
}
}
private void ConfirmSelection()
{
try
{
Answered = true;
if (MultipleSelection && DGV.Columns.Contains("Selected"))
{
Result_List = DGV.Rows.Cast<DataGridViewRow>().Where(x => x.Cells["Selected"].Value != null && x.Cells["Selected"].Value != DBNull.Value && x.Cells["Selected"].Value.ToString() == "V").Select(x => x.Cells["Value"].Value.ToString()).ToList();
}
else if (DGV.SelectedRows != null && DGV.SelectedRows.Count != 0)
{
Result = DGV.SelectedRows[0].Cells["Value"].Value.ToString();
}
this.Close();
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
}
private void DGV_Select_Multiple_Load(object sender, EventArgs e)
{
DGV.SizeChanged += delegate
{
try
{
if (DGV.Columns.Count == 1)
{
DGV.Columns[0].Width = DGV.Width - 22;
}
else
{
DGV.Columns[0].Width = DGV.Width - 30 - 22;
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
};
this.Shown += delegate
{
try
{
if (DGV.Columns.Contains("Selected"))
{
foreach (DataGridViewRow DGVRow in DGV.Rows)
{
DGVRow.Cells["Selected"].Value = "";
DGVRow.DefaultCellStyle.BackColor = SystemColors.Window;
}
}
if (Default_List != null && Default_List.Count != 0)
{
if (DGV.Rows.Count != 0)
{
DGV.ClearSelection();
if (DGV.Columns.Contains("Selected"))
{
foreach (DataGridViewRow DGVRow in DGV.Rows)
{
string str = DGVRow.Cells["Value"].Value.ToString();
if (Default_List != null && Default_List.Contains(str))
{
DGVRow.Cells["Selected"].Value = "V";
DGVRow.Cells["Selected"].Selected = true;
DGVRow.Selected = true;
}
}
}
else
{
foreach (DataGridViewRow DGVRow in DGV.Rows)
{
string str = DGVRow.Cells["Value"].Value.ToString();
if (Default_List != null && Default_List.Contains(str))
{
DGVRow.Selected = true;
}
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
}
};
}
}
public partial class DGV_Select_Multiple
{
public static List<string> ShowDialog(string Text, List<string> list, List<string> defaultList)
{
var f = new DGV_Select_Multiple(Text, list, defaultList);
f.ShowDialog();
return f.Answered ? f.Result_List : null;
}
public static string ShowDialog(string Text, List<string> list, string defaultString)
{
var f = new DGV_Select_Multiple(Text, list, defaultString);
f.ShowDialog();
return f.Answered ? f.Result : null;
}
}
}单个选择的用法:
string Question = DGV_Select_Multiple.ShowDialog("Please select a value...", new List<string> { "Value 1", "Value 2", "Value 3" }, defaultString: "Value 2");
if (Question != null)
{
MessageBox.Show("Answered single option " + Question );
}
else
{
MessageBox.Show("Used not answered...");
}多重选择的用法:
List<string> Question = DGV_Select_Multiple.ShowDialog("Please select a value...", new List<string> { "Value 1", "Value 2", "Value 3" }, defaultList: new List<string> { "Value 2"});
if (Question != null)
{
MessageBox.Show("Answered multiple options " + string.Join(", ", Question));
}
else
{
MessageBox.Show("Used not answered...");
}提示:若要访问Visual窗体设计器临时,请删除以下代码:
public partial class DGV_Select_Multiple
{
public static List<string> ShowDialog(string Text, List<string> list, List<string> defaultList)
{
var f = new DGV_Select_Multiple(Text, list, defaultList);
f.ShowDialog();
return f.Answered ? f.Result_List : null;
}
public static string ShowDialog(string Text, List<string> list, string defaultString)
{
var f = new DGV_Select_Multiple(Text, list, defaultString);
f.ShowDialog();
return f.Answered ? f.Result : null;
}
}https://stackoverflow.com/questions/64889115
复制相似问题