Формы DataGridView отсутствуют OnRowDataBound? - PullRequest
4 голосов
/ 09 апреля 2009

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

Рад иметь возможность помочь Я объяснил все о событии OnRowDataBound и о том, как вы можете подключиться к нему и динамически манипулировать ячейками в объекте строки, чтобы делать в значительной степени то, что вы хотите. Отлично. Если вы работаете с asp.net.

Единственная проблема в том, что он пишет приложение winforms, а DataGridView не поддерживает OnRowDataBound! Я не мог в это поверить, но его просто нет.

Так, как, черт возьми, ребята с формами вина справляются с этим?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2009

Событие RowsAdded примерно эквивалентно, но вы можете столкнуться с проблемами производительности, используя это событие для доступа к строкам из-за состояния общей памяти , которое оно использует. По сути, это схема, в которой DataGridView пытается минимизировать объем памяти, разделяя некоторое состояние, когда это возможно, между строками до тех пор, пока не получит доступ к одной из совместно используемых строк, что приводит к тому, что он не разделяет состояние (память и возможное снижение производительности) , Многое было оптимизировано, но по той или иной причине я столкнулся с проблемами при использовании этого события.

Так что, если RowsAdded работает для вас без снижения производительности, отлично. Если нет, у вас еще есть много вариантов. Вы можете наследовать от DataGridViewCell и DataGridView для добавления пользовательских типов ячеек (столбцов) в сетку. Вероятно, это самый сложный способ настройки DataGridView ... но он позволит практически любые манипуляции с ячейками, которые вы захотите.

Событие CellPainting дает вам возможность рисовать конкретную ячейку, если вы хотите, чтобы вы что-то нарисовали с помощью GDI + (System.Drawing) перед отображением. Также есть событие CellFormatting , которое также дает вам специальные аргументы событий, но я никогда не использовал его, поэтому я не уверен, имеет ли место проблема состояния общей памяти (обычно для события рисования это не).

НТН, Ричард

0 голосов
/ 09 апреля 2009

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

Чтобы было ясно, сетка данных в настоящее время привязана, отображаются существующие связанные столбцы. Теперь мне нужно добавить новые столбцы в таблицу данных и затем отобразить некоторые значения из объекта словаря.

пробовал этот код, но не повезло. Добавляются столбцы, но значения не отображаются.

                    if (dvMain.Columns[key] == null)
                    {
                        dvMain.Columns.Add(key, key);
                    }
                    dvMain[key,i].Value = myDictionary[key];
0 голосов
/ 09 апреля 2009

Я не совсем уверен, так как я тоже парень ASP.NET, но в winforms вы работаете в настоящей среде с состоянием, а не в «псевдо-состоянии» (через viewstate).

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

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