5

いくつ
かの複雑な winforms コントロールがあります。その状態を保存するには、カスタムのシリアル化されたクラスを使用します。それを xml にシリアライズしたとしましょう。これで、この xml をファイルとしてユーザー ディレクトリに保存するか、別のファイルに含めることができます....
しかし...

問題は
ユーザーが (設計時に) 彼の winform アプリケーション全体でそのようなコントロールをいくつか作成する場合、保存された構成のどれがこれらのコントロールのどれに属しているかを知るために、どの一意の識別子を使用するのが良いでしょうか?

したがって、この識別子は次のようにする必要があります。

  • アプリケーションの起動後も同じまま
  • 自動指定 (または、Control.Name が常に存在すると想定できるように、既に指定されている)
  • アプリケーション全体で一意

いくつかの方法を想像できると思いますが、デフォルトの方法がいくつかあると思います。

何を使うのが良いですか?なんで?

4

3 に答える 3

2

この小さな拡張メソッドが機能します。

public static class FormGetUniqueNameExtention
{
    public static string GetFullName(this Control control)
    {
        if(control.Parent == null) return control.Name;
        return control.Parent.GetFullName() + "." + control.Name;
    }
}

「Form1._flowLayoutPanel.label1」のようなものを返します

使用法:

Control aaa;
Dictionary<string, ControlConfigs> configs;
...
configs[aaa.GetFullName()] = uniqueAaaConfig;
于 2012-09-12T21:21:48.547 に答える
1

これは、フォームの完全な名前 (名前空間を含む) と、問題のコントロールの上の各親コントロールを含む一意の名前を定義するために作成したメソッドです。したがって、最終的には次のようになります。

MyCompany.Inventory.SomeForm1.SomeUserControl1.SomeGroupBox1.someTextBox1

    static string GetUniqueName(Control c)
    {
        StringBuilder UniqueName = new StringBuilder();
        UniqueName.Append(c.Name);
        Form OwnerForm = c.FindForm();

        //Start with the controls immediate parent;
        Control Parent = c.Parent;
        while (Parent != null)
        {
            if (Parent != OwnerForm)
            {
                //Insert the parent control name to the beginning of the unique name
                UniqueName.Insert(0, Parent.Name + "."); 
            }
            else
            {
                //Insert the form name along with it's namespace to the beginning of the unique name
                UniqueName.Insert(0, OwnerForm.GetType() + "."); 
            }

            //Advance to the next parent level.
            Parent = Parent.Parent;
        }

        return UniqueName.ToString();
    }
于 2014-01-16T14:50:23.500 に答える
1

私は、制御階層の完全なツリーで構成された複合識別子を使用してきました。フォーム名が Form1 であるとすると、グループボックス Groupbox1 とテキストボックス TextBox1 があり、複合識別子は Form1/Groupbox1/TextBox1 になります。

これをフォローしたい場合は、詳細は次のとおりです。

http://netpl.blogspot.com/2007/07/context-help-made-easy-revisited.html

于 2011-09-21T17:09:10.820 に答える