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 ?

不要解决方法!我知道我可以先创建 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 回答