首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过类实例返回引用?

如何通过类实例返回引用?
EN

Stack Overflow用户
提问于 2020-11-18 08:00:05
回答 2查看 73关注 0票数 0

我正在尝试构建一个通用的自定义选择器表单。根据类构造函数的不同,它应该返回单个值或值列表。

代码语言:javascript
复制
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";
        }
    }
}

每次使用这样一个冗余操作所需的类返回值:

代码语言:javascript
复制
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字符串,但最终没有改变。有任何方法可以简化上面的构造函数吗?

代码语言:javascript
复制
string Result = new DGV_Select_Multiple(new List<string> { "v1", "v2" }, "").Result;

或者类似的东西。感谢你的任何帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-18 08:39:54

将逻辑移到静态工厂方法中。因为您有两个返回类型,所以需要两个方法,但它们可以有相同的名称。

代码语言:javascript
复制
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....

现在,当您需要使用该表单时,只需编写:

代码语言:javascript
复制
string result= DGV_Select_Multiple.Show(new List<string> { "v1", "v2" }, "");

代码语言:javascript
复制
List<string> result= DGV_Select_Multiple.Show(new List<string> { "v1", "v2" }, new List<string> { "" });
票数 1
EN

Stack Overflow用户

发布于 2020-11-18 10:13:09

名为DGV_Select_Multiple的表单用于选择单个字符串值或多个字符串值,其中包括:

代码语言:javascript
复制
DataGridView DGV;
Label lb_Question;
Button b_confirm;
Button b_cancel;

完整的表单代码如下:

代码语言:javascript
复制
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;
        }
    }
}

单个选择的用法:

代码语言:javascript
复制
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...");
}

多重选择的用法:

代码语言:javascript
复制
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窗体设计器临时,请删除以下代码:

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64889115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档