Элемент управления Windows Forms DataGridView имеет разные типы элементов управления в одном столбце - PullRequest
8 голосов
/ 12 июня 2009

Можно ли сделать следующее в DataGridView:

В том же столбце я хочу изменить тип элемента управления каждой строки между DataGridViewTextBoxColumn и DataGridViewComboBoxColumn?

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

Спасибо

P.S. Я использую C #

Ответы [ 3 ]

9 голосов
/ 13 августа 2009

У меня недавно был похожий вариант использования, и в итоге я написал что-то вроде следующего кода:

Напишите пользовательский класс Cell и Column и переопределите методы EditType и InitializeEditingControl в ячейке, чтобы вернуть различные элементы управления соответствующим образом (здесь я просто привязываю данные к списку пользовательского класса с полем .useCombo, указывающим, какой элемент управления использования):

// Define a column that will create an appropriate type of edit control as needed.
public class OptionalDropdownColumn : DataGridViewColumn
{
    public OptionalDropdownColumn()
        : base(new PropertyCell())
    {
    }

    public override DataGridViewCell CellTemplate
    {
        get
        {
            return base.CellTemplate;
        }
        set
        {
            // Ensure that the cell used for the template is a PropertyCell.
            if (value != null &&
                !value.GetType().IsAssignableFrom(typeof(PropertyCell)))
            {
                throw new InvalidCastException("Must be a PropertyCell");
            }
            base.CellTemplate = value;
        }
    }
}

// And the corresponding Cell type
public class OptionalDropdownCell : DataGridViewTextBoxCell
{

    public OptionalDropdownCell()
        : base()
    {           
    }

    public override void InitializeEditingControl(int rowIndex, object
        initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        // Set the value of the editing control to the current cell value.
        base.InitializeEditingControl(rowIndex, initialFormattedValue,
            dataGridViewCellStyle);

        DataItem dataItem = (DataItem) this.OwningRow.DataBoundItem;
        if (dataItem.useCombo)
        {
            DataGridViewComboBoxEditingControl ctl = (DataGridViewComboBoxEditingControl)DataGridView.EditingControl;
            ctl.DataSource = dataItem.allowedItems;
            ctl.DropDownStyle = ComboBoxStyle.DropDownList;
        }
        else
        {
            DataGridViewTextBoxEditingControl ctl = (DataGridViewTextBoxEditingControl)DataGridView.EditingControl;
            ctl.Text = this.Value.ToString();
        }
    }

    public override Type EditType
    {
        get
        {
            DataItem dataItem = (DataItem)this.OwningRow.DataBoundItem;
            if (dataItem.useCombo)
            {
                return typeof(DataGridViewComboBoxEditingControl);
            }
            else
            {
                return typeof(DataGridViewTextBoxEditingControl);
            }
        }
    }
}

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

0 голосов
/ 12 июня 2009

Вы можете создать свой собственный класс, унаследованный от DataGridViewCell, и переопределить соответствующие виртуальные члены (InitializeEditingControls, EditType и, возможно, несколько других). Затем вы можете создать DataGridViewColumn с экземпляром этого класса в качестве шаблона ячейки

0 голосов
/ 12 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...