0

この方法でメインコントロールに新しいコントロールを追加しています。

Controls.Add(new ComboBox()
{
    Text = "dsnfsdbfsdbfjsdbfsdjbfsmdfbsdbfsbf",
    Anchor = AnchorStyles.Left | AnchorStyles.Right,
    Width = DropDownWidth(/*Here should be smth. similar to "this" but for currently created combobox*/)
});

public int DropDownWidth(ComboBox myCombo)
{
    int maxWidth = 0, temp = 0;
    foreach (var obj in myCombo.Items)
    {
        temp = TextRenderer.MeasureText(obj.ToString(), myCombo.Font).Width;
        if (temp > maxWidth)
        {
            maxWidth = temp;
        }
    }
    return maxWidth;
}

新しいコンボボックスを関数に渡し、目的の幅を取得したいと思います。

に似たキーワードがありthisますが、関数に渡すことができる新しく作成されたComboBox用ですか?

回避策はありません最初にコンボボックスを作成し、プロパティを入力して、次のステップでコントロールに追加できることを知っています。今のところ、短い形式だけが興味深いです。

ありがとうございました!

4

2 に答える 2

2

いいえ。オブジェクトの参照は、実際に作成されるまで使用できません。オブジェクトは、作成ステートメントの一部であるため、技術的にはオブジェクト初期化子には含まれていません。この場合、 「回避策」が必要です

何かのようなもの...

var myTextArray = new[] { "Hi", "ho", "Christmas" }

Controls.Add(new ComboBox()
{
    Text = "dsnfsdbfsdbfjsdbfsdjbfsmdfbsdbfsbf",
    Anchor = AnchorStyles.Left | AnchorStyles.Right,
    Width = DropDownWidth(myTextArray, this.Font)
});

...thisもちろん、あなたFormや他の親はどこにいますかControl

そして、変更されたDropDownWidthメソッドは次のようになります...

public int DropDownWidth(object[] objects, Font font)
{
    int maxWidth = 0, temp = 0;
    foreach (var obj in objects)
    {
        temp = TextRenderer.MeasureText(obj.ToString(), font).Width;
        if (temp > maxWidth)
        {
            maxWidth = temp;
        }
    }
    return maxWidth;
}
于 2012-12-21T13:40:30.557 に答える
1

まだ存在しないため、関数に渡すことはできません。

例:@ J.Steen:

    public class CustomCombo : System.Windows.Forms.ComboBox
{
    private int _width;

    public int Width
    {
        get { return _width; }
        set { _width = value; }
    }


    public CustomCombo()
    {
        _width = getWidth(this);
    }
    public int getWidth(System.Windows.Forms.ComboBox combo)
    {
        //do stuff
        return 0;
    }
}
于 2012-12-21T13:36:36.740 に答える