4
public partial class TestConrol : UserControl
{
    public TestConrol()
    {
        InitializeComponent();
    }

    public override string ToString()
    {
        return "asd";
    }
}

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

    private void Form1_Load(object sender, EventArgs e)
    {
        TestConrol tc1 = new TestConrol();
        comboBox1.Items.Add(tc1);

        TestConrol tc2 = new TestConrol();
        comboBox1.Items.Add(tc2);
    }
}

フォームがロードされると、コンボボックスに「asd」ではなく、名前が空の2つのアイテムがあることがわかります:
/

public class TestClass
{
    public override string ToString()
    {
        return "bla bla bla";
    }
}

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

    private void Form1_Load(object sender, EventArgs e)
    {
        TestClass tcl = new TestClass();
        comboBox1.Items.Add(tcl);
    }
}

その後、コンボボックスに「bla bla bla」が表示されます

4

5 に答える 5

5

コントロールにプロパティを作成し、コンボボックスの DisplayMember をそのプロパティにマップすると、機能するはずです。

于 2013-04-08T18:09:26.653 に答える
3

ソースコードを理解しようとしました(!)。これは への単純な呼び出しではありませんToString()

何かをしているinternalクラスがあります。System.Windows.Forms.Formatter最終的にコンバーターを作成します。これは、次のように言うのとほぼ同じです。

var conv = System.ComponentModel.TypeDescriptor.GetConverter(tc1.GetType());

tc1あなたの質問からはどこTestContolですか。ここで、TestClass tclインターフェイスを実装していない を使用した場合、最終的に を呼び出すコンバーターが得られますToString()

しかし、この例では を使用tc1しており、これはSystem.ComponentModel.IComponent. convしたがって、 になりますSystem.ComponentModel.ComponentConverter。の を使用しSiteますIComponent。私たちが言うとき:

string result = conv.ConvertTo(tc1, typeof(string));

が nullの場合、コンボ ボックスに表示されSiteた空の文字列を取得します。""があった場合、代わりにSiteそれを使用していたでしょう。Name

これを実証するには、TestControlインスタンス コンストラクターに次のコードを挿入します。

public TestConrol()
{
    InitializeComponent();
    Site = new DummySite(); // note: Site is public, so you can also
                            // write to it from outside the class.
                            // It is also virtual, so you can override
                            // its getter and setter.
}

どこDummySiteに次のようなものがあります:

class DummySite : ISite
{
    public IComponent Component
    {
        get { throw new NotImplementedException(); }
    }

    public IContainer Container
    {
        get { throw new NotImplementedException(); }
    }

    public bool DesignMode
    {
        get { throw new NotImplementedException(); }
    }

    public string Name
    {
        get
        {
            return "asd";  // HERE'S YOUR TEXT
        }
        set
        {
            throw new NotImplementedException();
        }
    }

    public object GetService(Type serviceType)
    {
        return null;
    }
}
于 2013-04-08T21:33:30.010 に答える
1

comboBox1.Items.Add(tc1.ToString());の代わりに使用comboBox1.Items.Add(tcl);

于 2013-04-08T18:10:34.427 に答える