none
VS2010 Combobox RRS feed

  • Вопрос

  • Здравствуйте!

    1.Если я хочу, чтобы для Combobox верхняя строка была пустой, то можно написать

      Me.cbx.SelectedIndex = -1
      Me.cbx.SelectedText = ""

    где cbx- мой Combobox. Как сделать то же для DataGridViewComboBoxColumn?

    2. Напротив, в DataGridViewComboBoxColumn есть свойство TextAlign, а у просто Combobox - его нет. Как-то можно в нем выровнять текст как я хочу, например, по правому краю?

    17 июня 2012 г. 20:06

Ответы

  • Скорей всего другого, красивее решения нет, т.к. пустая строка должна быть в источнике привязке, иначе, если вы просто добавите ее в комбобокс, а в привязке ее не будет - то получите ошибку.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 29 июня 2012 г. 7:43
    22 июня 2012 г. 12:13
  • Brash_O<abbr class="affil"></abbr>:

    У меня не WPF, поэтому я попробовал ( в переводе на VB.Net) второй способ, но ничего не произошло -:(

    Можно попробовать переопределить контрол так

    public class TextAlignedComboBox : ComboBox
    {
    	protected override void OnDrawItem(DrawItemEventArgs e)
      	{
       		e.DrawBackground();
        		if (e.Index < 0)
    			return;
        		string  text = this.Items[e.Index].ToString();
        		TextRenderer.DrawText(e.Graphics, text, e.Font, e.Bounds, e.ForeColor, TextFormatFlags.Right);
        		e.DrawFocusRectangle();
     	}
    }


    • Изменено Brash_O 22 июня 2012 г. 12:45
    • Помечено в качестве ответа Abolmasov Dmitry 29 июня 2012 г. 7:44
    22 июня 2012 г. 12:44

Все ответы

  • По 2 пункту если у вас WPF то попробуйте HorizontalContentAlignment
    Либо попробовать

    private void ComboBox1_DrawItem(object sender,DrawItemEventArgs e ) 
    {
            If (e.Index = -1) return ;
            e.DrawBackground();
            string text ComboBox1.Items(e.Index) 
            SizeF size = e.Graphics.MeasureString(text, e.Font); 
            e.Graphics.DrawString(text, Font, New System.Drawing.SolidBrush(ForeColor), (e.Bounds.Width - size.Width) / 2, e.Bounds.Top);
    }

    • Изменено Brash_O 18 июня 2012 г. 6:11
    18 июня 2012 г. 6:06
  • Привет.

    Когда именно вы хотите добавлять/отображать пустую строку? Потому что по умолчанию DataGridView появляется с незаполенными ComboBox и "пустая строка" как раз получается выбрана.

    До ComboBox вы поможете например добраться так:

    1) подписаться на событие DataGridView.EditingControlShowing

    2) в событии проверить индекс столбца (dataGridView1.CurrentCell.ColumnIndex), чтобы он соответсвовал индексу колонки DataGridViewComboBoxColumn.

    3) привести e.Control к типу ComboBox и делать с ним уже что хотите.

    Но такой подход не очень хорош тем, что данное событие вызывается каждый раз, как пользователь начинает редактировать ячейку.


    Для связи [mail]

    18 июня 2012 г. 7:11
  • Brash_O<abbr class="affil"></abbr>:

    У меня не WPF, поэтому я попробовал ( в переводе на VB.Net) второй способ, но ничего не произошло -:(

    Abolmasov Dmitry

    Действительно, по умолчаниюв DataGridViewComboBoxColumn "пустая строка"стоит первой, но как только я попадаю в эту ячейку, эта строка становится непустой, ей присваивается значение первой строки источника данных. Правда, оно пропадает (строка становится пустой), если не редактирую эту ячейку и иду дальше. Но если я редактирую эту ячейку (например, по ошибке), то вернуться к "пустой строке" не могу. И дальше, если происходит апдейт основной таблицы, то значение DataGridViewComboBoxColumn в нее запишется. Поэтому пока я вынужден держать в источнике данных "пустую строку", а это некрасиво

    18 июня 2012 г. 19:57
  • Скорей всего другого, красивее решения нет, т.к. пустая строка должна быть в источнике привязке, иначе, если вы просто добавите ее в комбобокс, а в привязке ее не будет - то получите ошибку.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 29 июня 2012 г. 7:43
    22 июня 2012 г. 12:13
  • А может стоит использовать конвертер, который будет модифицировать коллекцию из источника данных, добавляя впереди пустую строку.

    UPD. Извиняюсь не заметил что речь о WinForms. С конвертером не пройдет. По всему выходит ваш текущий вариант самый оптимальный.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    22 июня 2012 г. 12:29
    Отвечающий
  • Brash_O<abbr class="affil"></abbr>:

    У меня не WPF, поэтому я попробовал ( в переводе на VB.Net) второй способ, но ничего не произошло -:(

    Можно попробовать переопределить контрол так

    public class TextAlignedComboBox : ComboBox
    {
    	protected override void OnDrawItem(DrawItemEventArgs e)
      	{
       		e.DrawBackground();
        		if (e.Index < 0)
    			return;
        		string  text = this.Items[e.Index].ToString();
        		TextRenderer.DrawText(e.Graphics, text, e.Font, e.Bounds, e.ForeColor, TextFormatFlags.Right);
        		e.DrawFocusRectangle();
     	}
    }


    • Изменено Brash_O 22 июня 2012 г. 12:45
    • Помечено в качестве ответа Abolmasov Dmitry 29 июня 2012 г. 7:44
    22 июня 2012 г. 12:44