【问题标题】:Creating Edit dialog box in Windows Forms C#在 Windows 窗体 C# 中创建编辑对话框
【发布时间】:2012-04-23 23:00:51
【问题描述】:

我有 Form1.cs,它有两个按钮,分别是“添加”和“编辑”。

单击“添加”显示 Form2.cs 对话框。

Form2 有一个 TextBox 和一个 ComboBox。假设我们在文本框中输入值“A”并从 ComboBox 中选择“A”。 然后关闭 Form2。

然后,当在 Form1 上单击 EDIT 按钮时,Form2 应该在文本框中显示“A”,在 ComboBox 中选择“A”。

这是一个简单的解释。我使用的真实表单有大约 10-12 个不同的控件,包括组合框、复选框、文本框等。

我的主要疑问是我们在哪里以及如何保存这些控制值。

我缺少这种类型的对话框是否有特定的方法?

【问题讨论】:

    标签: c# winforms visual-studio visual-studio-2010 architecture


    【解决方案1】:

    创建类,它将存储您要传递的值(我们称之为Foo)。

    Form2 应该有一个属性。在属性的setter中,设置控件:

    public partial class Form2 : Form
    {
        private Foo _bar;
        public Foo Bar
        {
            set
            {
                _bar = value;
                //set your controls here
            }
        }
    

    在编辑按钮上,设置如下属性:

    Form2 form2 = new Form2();
    form2.Bar = bar; //bar contains values to edit
    

    然后在Form2 上放置一个保存按钮,这会将值从控件保存回该对象。

    对于每个控件,我都会在 Foo 类中拥有一个字段,例如。 string 用于文本框,bool 用于复选框,enumint 用于组合框(其中整数值将等于所选索引)。
    或者,您可以改用 Dictionary 类,并为每个控件设置键值对。

    如果您的表单在新建和编辑模式下的外观或行为不同,您也可以拥有一些enum

    【讨论】:

    • Foo 类应该是什么样的?我的意思是,我们如何在 Foo 中存储几种类型的控件(复选框、组合框、文本框等)的 KEY(即说控件名称)、VALUE(即说控件值)对?我相信这就是 Foo 类的概念。
    • 对于每个控件,我将在此类中有单独的字段或属性。我将其添加到我的答案中。
    【解决方案2】:

    您的对话表单应该有一个包含您想要的属性/字段的字段,例如一个业务对象的副本。然后,根据您想要的行为,在对话框构造函数或 Load 中传递或初始化它。从那里您可以创建/初始化您的控件。

    如果您想要一个内置系统,您可能想看看 PropertyGrid(您可以将其嵌入对话框中(以适合您的问题)

    【讨论】:

    • 引用你@Max.gd“你的对话框表单应该有一个包含你想要的属性/字段的字段”,你是否暗示表单中有一个包含控件值的对象?还是我弄错了,请你解释一下?
    • 对于您正在寻找的行为没有任何内置功能(属性网格除外)。但是您可以添加一个,在最简单的情况下,它是您正在编辑的对象的副本。它将至少包含您要编辑的所有值。 ... Car _myCar; void MyDialog(Car myCar){ _myCar = myCar; } void Load(){ textBoxBrand.Text = _myCar.Brand.ToString(); ... }
    【解决方案3】:

    您想只加载用户在此处输入的最后一个值吗?

    例如他在文本框上写“文本”并选择“A”组合框,下次打开它时应该预先选择它?

    编辑:然后不要使用 Form.Close 关闭它,而是让它隐藏起来。 Form1.隐藏。下次打开时,值仍会保存。除非申请已经关闭。另一方面,用户可能会单击窗口窗体中的关闭按钮。您可以通过属性使其“不可点击”,也可以使用我认为的事件对其进行配置。

    【讨论】:

    • 哦,很抱歉没有回复您。我还没有尝试过,但我想它会起作用。我的担忧仍然是:我使用的实际表单有多个控件,用户可以多次单击添加按钮。每次创建一个新的 Form2 时,都会有其他东西与表单的返回值一起使用。每次都必须是新的形式。所以隐藏表单可能会导致一些内存问题。我将您的答案标记为有用,因为它可能是解决方案之一。我仍然会寻找一个理想的。谢谢。
    • @dushyantp 希望你修复它,伙计。祝你好运。如果您需要代码方面的帮助,我可以提供帮助。
    • 感谢您的帮助。我使用用户定义类的对象来存储值,就像 Tschareck 在这篇文章的答案中所描述的那样。它对我有用。干杯。
    【解决方案4】:

    在 Form2 上创建一个方法,您将在其中将值设置到 textBox 并在组合框中选择一个项目。在实例化 form2 之后和显示它之前调用此方法。 示例:

        public Form2()
        {
            InitializeComponent();
            comboBox1.Items.AddRange(new string[] { "a", "b", "c" });//fill comboBox your way on a loading time
        }
    
        public void UpdatingControls(string a, string b)
        {
            textBox1.Text = a;
            comboBox1.SelectedText = b;
        }
        //on form2;
        Form1 f2;
        private void OpenForm2Button_Click(object sender, EventArgs e)
        {
            f2 = new Form2();
            f2.UpdatingControls("a", "b"); //a will go into textBox, b will be choosen in comboBox
        }
    

    【讨论】:

    • 我对问题进行了编辑,不够清楚:) 我的主要疑问是您将控制值保存在哪里?是数组列表、配置文件还是我们对此有特定的架构概念?
    【解决方案5】:
    public Form2(string form1Textbox)
    {
        InitializeComponent();
        form2Textbox.Text = form1Textbox;
    }
    

    【讨论】:

    • 我对问题进行了编辑,不够清楚:) 我的主要疑问是您将控制值保存在哪里?是数组列表、配置文件还是我们对此有特定的架构概念?
    • 这取决于你。如果您只需要短时间内的值,请使用单例对象。较长时间的数据库或xml文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多