2016-04-25 2 views
1

У меня есть пользовательский DataGridView с несколькими различными типами ячеек, которые наследуются от DataGridViewTextBoxCell и DataGridViewCheckBoxCell.Host Checkbox в DataGridViewTextBoxCell

Каждая из этих пользовательских ячеек имеет свойство устанавливать цвет фона (необходимый для некоторых функций сетки), называемый CellColour.

Для простоты мы возьмем два из пользовательских ячеек:

public class FormGridTextBoxCell : DataGridViewTextBoxCell 
{ 
    public Color CellColour { get; set; } 
    ... 
} 

public class FormGridCheckBoxCell : DataGridViewCheckBoxCell 
{ 
    public Color CellColour { get; set; } 
    ... 
} 

ПРОБЛЕМА:

Это означает, что каждый раз, когда я хочу, чтобы установить свойство CellColour для сетки Его, которая содержит столбцы как Введите FormGridTextBoxColumn и FormGridCheckBoxColumn (которые имеют CellTemplaes вышеупомянутых типов пользовательских ячейки соответственно) я должен сделать следующее:

if(CellToChange is FormGridTextBoxCell) 
{ 
    ((FormGridTextBoxCell)CellToChange).CellColour = Color.Red; 
} 
else if (CellToChange is FormGridCheckBoxCell) 
{ 
    ((FormGridCheckBoxCell)CellToChange).CellColour = Color.Red; 
} 

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

РЕШЕНИЕ ЗАПРАШИВАЕМЫЕ:

У меня есть это в моей голове, что если я могу создать единственный класс, который наследует от DataGridViewTextBoxCell, а затем иметь пользовательские типы Cell, в свою очередь наследуют от этого класса:

public class FormGridCell : DataGridViewTextBoxCell 
{ 
    public Color CellColour { get; set } 
} 

public class FormGridTextBoxCell : FormGridCell 
{ 
    ... 
} 

public class FormGridCheckBoxCell : FormGridCell 
{ 
    ... 
} 

Я тогда только нужно сделать следующее:

if(CellToChange is FormGridCell) 
{ 
    ((FormGridCell)CellToChange).CellColour = Color.Red; 
    ... 
} 

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

ПОЧЕМУ ЭТО ПРОБЛЕМА:

Я попытался после этой статьи:

Host Controls in Windows Forms DataGridView Cells

Это работает для пользовательских DateTime Picker однако хостинг галку в DataGridViewTextBoxCell является другой коленкор так как существуют различные свойства для управления значением ячеек.

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

ответ

1

Как я уверен, вы нашли, один класс может наследовать только один базовый класс.Что вы хотели это interface, такие как:

public interface FormGridCell 
{ 
    Color CellColor { get; set; } 
} 

Оттуда, вы можете создавать свои подклассы совершенно аналогично, унаследовав от своих DataGridViewCell типов , а также реализации interface:

public class FormGridTextBoxCell : DataGridViewTextBoxCell, FormGridCell 
{ 
    public Color CellColor { get; set; } 
} 

public class FormGridCheckBoxCell : DataGridViewCheckBoxCell, FormGridCell 
{ 
    public Color CellColor { get; set; } 
} 

На этом этапе использование так же просто, как вы надеялись; создать клетки через CellTemplate, и при необходимости просто отлитые клетки к interface типа и вы свободны делать то, что вы хотели (чтобы увидеть результаты визуально, я установил BackColor ячейки в качестве примера):

if (cell is FormGridCell) 
{ 
    (cell as FormGridCell).CellColor = Color.Green; 
    cell.Style.BackColor = Color.Green; 
} 
else 
{ 
    cell.Style.BackColor = Color.Red; 
} 
+0

Именно это я и сделал. Большое спасибо! И да, корень проблемы был в основном из-за того, что он мог наследовать только из одного базового класса. –

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