C#动态表单文本

时间:2012-11-24 15:42:28

标签: c# winforms

我有一个继承的表单并将其用作设置表单。我要求用户输入名称进行存储,我想根据输入数据动态更改表单标题(表单的文本属性)。但如果我更改基本表单标题,则会发生溢出。我也以基本形式创建FormTitle属性以保存当前的表单名称。

例如我的应用程序名称是SerenaIR,我想在下面显示所有表单的样式。

SerenaIR |商店名称|表格名称
例如:SerenaIR | SuperMarket |销售

FormTitle属性

    private string _frmTitle;
    /// <summary>
    /// current form title for showing on title bar.
    /// </summary>
    [Category("JSCustomizer"),
     Description("The text that is displayed on form title bar.")]
    public string FormTitle
    {
        get { return _frmTitle; }
        set
        {
            try
            {
                _frmTitle = value;
                Invalidate();
                var appPreName = Properties.Settings.Default.AppNamePre + @" " + Properties.Settings.Default.AppName;

                if(_frmTitle.Length < 3)
                {
                    base.Text = appPreName;
                }
                else
                {
                    base.Text = appPreName + @" | " + _frmTitle;
                }
            }
            catch
            {
                return;
            }
        }
    }

在设置表单中我保存关于商店名称的设置,并且当我想通过下面的代码更改标题时,在基本表单上,所有的继承表单都会引发错误!

    private void JSfrmBaseLoad(object sender, EventArgs e)
    {
            Text = Properties.Settings.Default.AppNamePre + @" " + Properties.Settings.Default.AppName;
    }

2 个答案:

答案 0 :(得分:2)

假设Form2继承了Form1,var strInput是用户输入的文本。然后,在创建Form2时,也许你可以写:

//Form1, Form2 definition
public partial class Form2 : Form1
//set Form2 title.
var strInput = "Sale";
var d2 = new Form2 {Text = base.Text + " | " + strInput};

答案 1 :(得分:1)

我的猜测是你正在创建导致溢出的无限循环。但我认为真正的问题是你误解了继承在这种情况下是如何工作的。更改基表单上的非静态属性值不会更新继承表单的值,因为每个表单都是一个新实例。

我的建议是使用Program.cs中的属性来存储表单标题。在这个例子中,我在单击按钮时更改表单标题。所有继承Form1的表单都将在OnLoad中设置新表单标题。

的Program.cs:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        FormTitle = Properties.Settings.Default.FormTitle;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    public static string FormTitle { get; set; }
}

Form1中:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        Text = Program.FormTitle;
        base.OnLoad(e);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Program.FormTitle = "new form title";
        Text = Program.FormTitle;
        new Form2().Show();
    }
}