2010-05-20 3 views
3

У меня есть этот код, который регулирует ширину выпадающий раскрывающегося списка:Регулировка ComboBox DropDown Ширина в C#

private void comboBox_DropDown(object sender, EventArgs e) 
    { 
    ComboBox senderComboBox = (ComboBox)sender; 
    int width = senderComboBox.DropDownWidth; 
    Graphics g = senderComboBox.CreateGraphics(); 
    Font font = senderComboBox.Font; 
    int vertScrollBarWidth = 
     (senderComboBox.Items.Count > senderComboBox.MaxDropDownItems) 
     ? SystemInformation.VerticalScrollBarWidth : 0; 
    int newWidth; 

    foreach (string s in ((ComboBox)sender).Items) 
    { 
     newWidth = (int)g.MeasureString(s, font).Width 
      + vertScrollBarWidth; 

     if (width < newWidth) 
     { 
      width = newWidth; 
     } 
    } 

    senderComboBox.DropDownWidth = width; 
    } 

Он отлично работает, за исключением того, что расширяет ширину раскрывающегося списка справа, в то время как Я предпочел бы, чтобы он расширялся влево, потому что comboBox находится в правой части моей формы. Любые мысли или предложения, которые у вас могут быть оценены. Благодарю.

+0

Не заботится ли об этом имущество «.anchor»? – Pretzel

+0

@ Pretzel: Как я понимаю, «Anchor» влияет только на размер элемента управления при изменении размера формы. –

ответ

0

После долгих поисков выяснилось, что на самом деле это постоянная проблема, с которой Microsoft еще не справилась (большой сюрприз). Я решил перестроить свой макет, чтобы лучше разместить эту функцию - недостаток, когда я получаю время, но пока я просто буду жить с этим. Спасибо всем за ваш вклад.

+0

Неужели мое решение не работает для вас? Я признаю, что это своего рода «хак-иш», но, по моему опыту, он абсолютно жизнеспособен без каких-либо странных побочных эффектов. – Pretzel

+0

Hi Pretzel. К сожалению нет. Перемещение элемента управления во время его использования на самом деле не является жизнеспособным вариантом для этого приложения. Я перестроил макет, чтобы работать с ограниченным набором функций Microsoft в их комбинированной коробке. Спасибо за предложение. –

3

Итак, так .Анчор не работал, как я ожидал, так что вот совершенно новый ответ, который работает, но я чувствую, что это своего рода взломать (но, возможно, это вполне разумный способ справиться с этим) :

int x = 10;   
comboBox1.Location = new Point(comboBox1.Location.X - x, comboBox1.Location.Y); 
comboBox1.Width += x; 

Этот код тянет его обратно вдоль оси х на 10 пикселей, а затем расширяется ComboBox1 на 10 пикселей.

Это работает очень гладко для меня. Это работает для вас?

+0

+1 ха-ха, это умно. – Mike

+0

Я не уверен, что буду использовать слово «умный», но спасибо ... :-) Как-то я все еще чувствую, что должен быть более элегантный способ сделать это. * Пожимает плечами * Я думаю, это WinForms для тебя, верно? – Pretzel

2

Я написал статью о CodeProject о том, как взломать поле со списком, чтобы дать ему полосу прокрутки для прокрутки по горизонтали. См. Здесь article.

+0

+1 - Whoa. Это очень мило, мужик. Я не уверен, что это то, чего хочет OP, но вы получите от меня повышенную выгоду, поскольку это может быть лучшим решением его проблемы. – Pretzel

+0

@Pretzel: Спасибо! :) – t0mm13b

+0

На самом деле, я предпочитаю эту тему, поэтому я могу вернуться и более внимательно посмотреть на ваш код. Я вижу, как использовать его в другом проекте ... :) – Pretzel

0

Возможно, вы захотите взглянуть на размещение элемента управления внутри контейнера. Например, создайте FlowLayoutPanel со свойством FlowDirection для RightToLeft. Поместите ComboBox в новую панель. Одно из преимуществ этого метода заключается в том, что вы можете изменять размеры любым способом, а управление/контейнер будет вести себя так, как ожидалось.

+0

Спасибо, bleh, но я попробовал установить свойство RightToLeft, но он не дал мне результатов, которые я хотел. –

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