2009-07-03 7 views
3

Можем ли мы разместить элементы управления C# textBox в выпадающем списке C#?C# - .net элементы управления как элементы ComboBox

То есть, когда комбо опускается, каждый из его элементов отобразит текстовое поле.

+1

Вы должны быть более конкретными ... какие технологии вы говорите? WPF, Windows Forms, ASP.NET? –

ответ

7

В формах окон это не совсем возможно, но вы можете перехватить сообщение окна, которое вызывает выпадающее поле со списком, и вместо этого отображает панель или форму.

В качестве места для начала:

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); 
    } 
} 
+0

Ничего себе, подробная информация о том, как сделать WinForms ComboBox с настраиваемым выпадающим списком. Большое спасибо за ваш отзыв! –

1

Не в Windows Forms, но в WPF вы можете положить что-нибудь в ComboBox ...

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 Forms выпадающий может быть хлопот.

+0

Это потрясающе! –

+0

<3 WPF, что делать в WinForms –

1

Возможно, я укажу очевидное, но с Silverlight.

0

Если вы говорите об ASP.NET, тогда ответ будет «Нет», если вы используете стандартные элементы управления ASP.NET. Однако, если вы создаете элемент управления ComboBox с помощью HTML/JavaScript, тогда да, вы можете.

0

Я считаю, что JMSA говорит о Windows Forms.

Я не эксперт .NET, но вы могли бы создать собственный собственный блок OwnerDrawn. Существуют такие методы, как OnDrawItem() и MeasureItem(), которые имеют ListBoxs и другие элементы управления хранением элементов; которые можно переоценить, и вы можете иметь полный контроль.

CheckBoxRenderer и т. Д. - это классы, которые можно найти в Интернете, которые принимают графический объект и могут рисовать окна.

Это, конечно, очень длительный процесс: я бы рекомендовал искать более простой способ выполнить вашу задачу. У меня тоже иногда у меня сумасшедший клиент, который хочет роскошные суперболочки, ну ... возьмите вызов!

Смежные вопросы