C# - .net控件作为ComboBox项

时间:2009-07-03 17:12:44

标签: c# combobox

我们可以将C#textBox控件放在C#下拉组合框中吗?

也就是说,当组合下拉时,它的每个项目都会显示一个文本框。

7 个答案:

答案 0 :(得分:7)

是的,WPF中的示例:

<Window x:Class="WpfApplication7.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ComboBox Margin="49,61,75,0" Height="25" VerticalAlignment="Top">
            <ComboBox.Items>                
                <ComboBoxItem>
                    <TextBox>TextBox</TextBox>
                </ComboBoxItem>
                <ComboBoxItem>
                    <TextBlock>TextBlock</TextBlock>
                </ComboBoxItem>
                <ComboBoxItem>
                    <Button>Button</Button>
                </ComboBoxItem>
            </ComboBox.Items>
        </ComboBox>
    </Grid>
</Window>
Windows窗体中的

组合框可能很麻烦。

答案 1 :(得分:7)

在Windows窗体中,它不太可能,但您可以拦截导致组合框下拉并显示面板或窗体的窗口消息。

作为一个开始的地方:

public class UserControlComboBox : ComboBox, IMessageFilter
{
    public readonly MyControlClass UserControl = new MyControlClass();

    protected override void WndProc(ref Message m)
    {
        if ((m.Msg == 0x0201) || (m.Msg == 0x0203))
        {
            if (DroppedDown)
                HideUserControl();
            else
                ShowUserControl();
       }
        else
        {
            base.WndProc(ref m);
        }
    }

    public bool PreFilterMessage(ref Message m)
    {
        // intercept mouse events
        if ((m.Msg >= 0x0200) && (m.Msg <= 0x020A))
        {
            if (this.UserControl.RectangleToScreen(this.UserControl.DisplayRectangle).Contains(Cursor.Position))
            {
                // clicks inside the user control, handle normally
                return false;
            }
            else
            {
                // clicks outside the user controlcollapse it.
                if ((m.Msg == 0x0201) || (m.Msg == 0x0203))
                    this.HideUserControl();
                return true;
            }
        }
        else return false;
    }

    public new bool DroppedDown 
    {
        get { return this.UserControl.Visible; } 
    }

    protected void ShowUserControl()
    {
        if (!this.Visible)
            return;

        this.UserControl.Anchor = this.Anchor;
        this.UserControl.BackColor = this.BackColor;
        this.UserControl.Font = this.Font;
        this.UserControl.ForeColor = this.ForeColor;

        // you can be cleverer than this if you need to
        this.UserControl.Top = this.Bottom;
        this.UserControl.Left = this.Left;
        this.UserControl.Width = Math.Max(this.UserControl.Width, this.Width);

        this.Parent.Controls.Add(this.UserControl);
        this.UserControl.Visible = true;
        this.UserControl.BringToFront();

        base.OnDropDown(EventArgs.Empty);

        // start listening for clicks
        Application.AddMessageFilter(this);
    }

    protected void HideUserControl()
    {
        Application.RemoveMessageFilter(this);

        base.OnDropDownClosed(EventArgs.Empty);
        this.UserControl.Visible = false;
        this.Parent.Controls.Remove(this.UserControl);

        // you probably want to replace this with something more sensible
        this.Text = this.UserControl.Text;
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            this.UserControl.Dispose();
        }

        base.Dispose(disposing);
    }
}

答案 2 :(得分:1)

不在Windows窗体中,但在WPF中,您可以将任何内容放在ComboBox中......

答案 3 :(得分:1)

是的,如果您使用的是WPF。

答案 4 :(得分:1)

我可能会说明显而易见的,但也有Silverlight。

答案 5 :(得分:0)

如果您正在谈论ASP.NET,那么如果您使用的是标准ASP.NET控件,则答案为“否”。但是,如果使用HTML / JavaScript创建ComboBox样式控件,则可以使用“是”。

答案 6 :(得分:0)

我相信JMSA正在谈论Windows Forms。

我不是.NET专家,但您可以创建自己的OwnerDrawn组合框。 ListBoxs和其他项控件具有OnDrawItem()和MeasureItem()等方法;这可以被覆盖,你可以完全控制。

CheckBoxRenderer等是可以在线找到的类,它们可以绘制图形对象并可以绘制窗体。

这当然是一个非常漫长的过程:我建议寻找一种更简单的方法来完成你的任务。我也有时候我有一个疯狂的客户谁想要华而不实的超级组合,好吧......接受挑战!