2012-04-02 3 views
0

Свойство DatagridviewCell.Datagridview доступно только для чтения. То же самое относится к другим элементам datagridview с ссылкой Datagridview, как строки и столбцы. Тем не менее, когда вы добавляете/удаляете элементы из datagridview, это свойство правильно устанавливается за кулисами, поэтому никогда не возникает несоответствия между ссылками родительского datagridview на его элементы и наоборот.Как установить свойство DataGridViewCell.Datagridview?

Как выполнить datagridview? Я пытаюсь сделать что-то подобное себе. Единственный «трюк», о котором я знаю, заключается в том, чтобы поместить определение коллекции в определение класса или наоборот, чтобы элемент или коллекция имели доступ к закрытым полям другого, но, глядя на пространства имен datagridview, это, похоже, не так ,

ответ

0

DateGridView использует «внутренний» модификатор доступа. Как вы знаете, существует 4 разных модификатора доступа.

public string MyPetPeeve 
private string MyPetPeeve 
protected string MyPetPeeve 
internal string MyPetPeeve 

Вот краткий обзор поведения модификаторов доступа:

общественности: MyPetPeeve является доступным для всех, кто хочет знать.

закрытый: MyPetPeeve доступен только из класса или структуры, которые его содержат.

protected: MyPetPeeve доступен для класса или структуры, которые его содержат. PLUS, любой класс, полученный из класса MyPetPeeves.

внутренний: MyPetPeeve доступен для любого класса или структуры, которые существуют в одной и той же сборке. Например, DataGridView существует в сборке System.Windows.Forms, поэтому любой класс или структура, найденные в System.Windows.Forms, могут изменять свойство DatagridviewCell.Datagridview. Для любого другого пользователя, находящегося за пределами System.Windows.Forms, в этом случае вы являетесь частным.

+0

Звучит логично, хотя и немного странно. Поскольку необходимо, чтобы родительский dgv и дочерний элемент ссылались друг на друга, синхронизированы, позволяя _anything_ внутри сборки Forms изменять свойство dgv элемента, является довольно широкой областью. Я думаю, все в порядке, поскольку MS явно контролирует всю сборку, но мне интересно, имеются ли дополнительные проверки. – Tekito

+0

Это не очень странно, просто накладывает нагрузку на синхронизацию на разработчика в обмен на какой-то ЧУДЕСНЫЙ неограниченный доступ, который за пределами разработчиков даже не видит. Кстати, если вы определяете свойство вроде этого: public string Text {get; задавать; }, вы можете сделать «set» следующим: public string Text {get; внутренний набор;}. Если вы хотите пойти «под капотом» и посмотреть код, написанный Microsoft для DataGridView, вы можете использовать Reflector от Red-Gate. www.reflector.net – RichardB

+0

Пока разработчик (и будущие разработчики) помнит правила синхронизации. Но, возможно, лучшее решение, так как мое было немного запутанным: абстрактный дочерний класс, определенный внутри определения коллекции, который при запуске передает коллекцию ссылку на делегат, которая позволяет изменять его частное поле '_parentColl'. Таким образом, ссылка на сборник для детей остается скрытой для всех, за исключением одного делегата внутри коллекции, который он использует для синхронизации при добавлении/удалении дочерних элементов. Слишком сложно. – Tekito

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