2009-07-03 54 views
3

我們可以將C#文本框控件放置在C#下拉組合框中嗎?C# - .net控件作爲組合框項目

也就是說,當組合下拉時,其每個項目都會顯示一個文本框。

+1

你應該更具體的...你說的是哪種技術? WPF,Windows窗體,ASP.NET? – 2009-07-03 19:07:04

回答

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

無法在Windows窗體,但在WPF,你可以把任何東西在組合框...

1

是的,如果你正在使用WPF。

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窗體ComboBox可能是一個麻煩。

+0

太棒了! – 2010-02-03 09:40:22

+0

<3 WPF,在WinForms中做這件事 – 2010-02-25 03:43:20

1

我可能會說明明顯的,但也有Silverlight。

0

如果你在談論ASP.NET,那麼如果你使用標準的ASP.NET控件,答案是否定的。但是,如果您使用HTML/JavaScript創建ComboBox樣式控件,那麼您可以。

0

我相信JMSA正在談論Windows Forms。

我不是.NET專家,但您可以創建自己的OwnerDrawn組合框。有ListBoxs和其他項目控件控件具有的方法,如OnDrawItem()和MeasureItem();可以重寫,你可以完全控制。

CheckBoxRenderer等是可以在線找到的類,它可以獲取圖形對象並可以繪製窗體。

這當然是一個非常漫長的過程:我會建議尋找一種更簡單的方式來完成您的任務。我也有時我有一個瘋狂的客戶誰想要華麗的超級組合框,好..接受挑戰!