1

継承したフォームがあり、設定フォームとして使用しています。保存する名前を入力してもらい、入力データに応じてフォームタイトル(フォームのテキストプロパティ)を動的に変更したい。しかし、ベースフォームのタイトルを変更すると、オーバーフローが発生します。また、現在のフォーム名を保存するために、ベースフォームにFormTitleプロパティを作成します。

たとえば、私のアプリケーション名はSerenaIRであり、すべてのフォームについて以下のスタイルを表示したいと思います。

SerenaIR | ストア名| フォーム名例: SerenaIR
| スーパーマーケット| セール

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;
    }
4

2 に答える 2

2

Form2がForm1を継承したとしましょう。varstrInputはユーザーからのテキスト入力です。次に、Form2を新しくするときに、次のように書くことができます。

//Form1, Form2 definition
public partial class Form2 : Form1
//set Form2 title.
var strInput = "Sale";
var d2 = new Form2 {Text = base.Text + " | " + strInput};
于 2012-11-24T16:09:19.077 に答える
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; }
}

フォーム1:

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();
    }
}
于 2012-11-24T16:43:35.400 に答える