将新构造的控件传递给函数

时间:2012-12-21 13:20:32

标签: c# .net

我正在以这种方式向主控件添加新控件:

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

我想将新的Combobox传递给函数并获得所需的宽度。

是否有一些类似于this的关键字,但是对于我可以传递给函数的新创建的ComboBox?

没有变通办法!我知道我可以先创建Combobox,填充属性并在下一步添加控件。 现在只有简短形式才有意思。

谢谢!

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
    }
}