2009-08-27 3 views
4

Я пишу приложение .NET WinForms, которое должно отображать список результатов в удобном для пользователя формате. Вот как я надеюсь отобразить данные.Нужна помощь в создании элемента управления для отображения данных

alt text http://img398.imageshack.us/img398/4336/imgdyu.png

таблица должна поддерживать приличное количество данных (> = 200 отдельных «блоков данных»), и должен быть довольно быстро. Я не знаю, как это сделать, и я надеялся на какое-то направление и совет. Я создал быстрый прототип пользовательского элемента управления, который просто использовал кучу текстовых полей, уложенных друг на друга. Он работал достаточно хорошо, но Windows слишком быстро справляется с текстовыми полями. Я мог бы создать пользовательский элемент управления текстовыми полями, но это заняло бы много времени, и мне было интересно, есть ли какие-либо рекомендации для альтернативных решений? Благодарю.

ответ

3

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

  1. управление сторонним стоит денег
  2. управления сторонних производителей имеют тенденцию к всасыванию
  3. сторонние элементы управления требуют, чтобы вы распространяли как минимум дополнительную DLL, по которой вы обычно не имеете контроля
  4. , даже если сторонний элемент управления может в конечном итоге сделать то, что вам нужно, вам потребуется некоторое время и попытаться выяснить, как его использовать, и как забить i т в форму вы требуете

Для чего-либо из обычного (как то, что вы делаете), писать свой собственный UserControl лучший путь, для них (среди других) причины:

  1. Написание собственного UserControl - это самое интересное, что вы можете сделать в .Net
  2. вам нужно будет кое-чему научиться, но полученные знания сразу же переносятся на другие проблемы и проекты (тогда как независимо от того, что вы узнаете об использовании Infinite Wonderfulness Gridifier от Initrode, вы только сможете помочь вам с использованием этого конкретного элемента управления)
  3. не будет ничего дополнительно распространять с приложением
  4. полного контроля над исходным кодом
  5. бесплатно навсегда (с извинениями Evony)
  6. неба это предел - с каким-либо контролем третьей стороной, вы в конечном итоге столкнется с чем-то, чего он просто не может сделать, но если вы делаете это самостоятельно, вы можете буквально сделать все, что хотите.

Ваша конкретная проблема (хорошо описанная в вашем вопросе, благодаря графике) довольно легко сделать, поскольку в основном пользовательский UserControl (с TextBox или двумя брошенными в th e mix). Единственными методами, которые вам понадобятся из объекта System.Drawing.Graphics, являются DrawRectangle, FillRectangle, MeasureString и DrawString. Вам даже не понадобится документация, поскольку Intellisense предоставит вам все, что вам нужно.

Если у вас возникнут проблемы, я напишу вам его для печенья с шоколадным чипсом. :)

Обновление: так как вам нужно, чтобы текст был доступен для выбора, это делает этот подход более сложным. Реализация собственной функциональности типа Textbox - это гигантская боль в петарде, но относительно простое решение - добавить реальный многострочный текстовый блок поверх любого текстового прямоугольника, когда пользователь нажимает на него, и поместить текст прямоугольника (предварительно выбранный) в текстовое поле. Когда это временное текстовое поле теряет фокус (LostFocus), вы рисуете отредактированный текст в прямоугольник и удаляете текстовое поле. Таким образом, у вас есть только одно текстовое поле в вашем UserControl.

Эта версия обойдется вам в два куки.

Обновление 2: Вот simple application, который демонстрирует, как использовать один текстовый блок, чтобы весь ваш элемент управления можно было выбирать и редактировать. И вот source code.

+0

Где мои куки? :) – MusiGenesis

+0

Спасибо за помощь. Ваше решение было именно тем, что я искал. – Mav3rick

0

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

WPF ListBox с шаблоном данных также может достичь аналогичного поведения.

-2

Если это веб-приложение:

Это редактируемые данные на странице, или это только для отображения? Если первый, подумайте о том, чтобы каждый элемент был ссылкой на новую страницу редактора, которая будет редактировать один блок за раз.

Если вы только показываете данные без возможности редактирования, используйте элемент управления ретранслятора для вывода таблицы HTML. Посмотрите на

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/repeater.aspx

Ретранслятор связывается с любым источником данных - список <>, Array, DataTable и т.д. - и итерацию по содержанию, и отображает данные для каждой строки в соответствии с шаблоном вы укажете в aspx.

Если это приложение WinForms

Спросите себя, почему приложение не веб-основе. В настоящее время (по моему очень скромному мнению) очень мало приложений, которые лучше подходят для реализации winForms. Хорошими примерами являются графические редакторы, компиляторы и т. Д. Однако механизм отчетов скорее всего будет лучше подходит для веб-реализации. YMMV.

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

+0

Отчет представляет собой лишь один компонент в этом приложении. Это дополнение является частью постоянной поддержки и улучшений. Переписывание всего приложения в виде веб-приложения было бы непрактичным на данный момент. Я хотел бы, чтобы данные были выбраны, поэтому метки не могут использоваться. – Mav3rick

+0

Право david: с большим количеством текстовых полей ваши приложения становятся медленными и неуправляемыми. вы можете использовать ярлык, и если пользователь нажимает на метку, вы немедленно заменяете его текстовым полем. как только он уйдет (событие «LostFocus»), вы спрячете текстовое поле. это позволяет как изменять, так и выбирать контент. – Atmocreations

0

Будет ли DataRepeater от Visual Basic PowerPack подходит для вас?Это загрузка для VS2k5 и установка с VS2k8. Если нет, проверьте TemplateListBox на странице www.codeproject.com/KB/cpp/TemplateListBox.aspx и ContinousControl на странице blogs.vbcity.com/hotdog/archive/2006/10/26.aspx.

0

Не зная больше о данных, я думаю, вам нужен пользовательский элемент управления, который будет «повторным» битом. Вы можете использовать элемент управления TableLayout (или FlowLayout, возможно?) И добавлять/удалять элементы из таблицы по мере необходимости.

Если ваши данные являются табличными, возможно, с родительским/дочерним отношением, я бы сказал, что вы должны использовать элемент управления сеткой. Я не согласен с утверждением другого ответа здесь, что вы должны избегать контроля сторонних производителей. Они сэкономит вам время очень быстро - некоторые, например, контроль GridEx от Janus, стоят относительно немного (несколько сотен фунтов) и сэкономят вам часы, которые, если вы работаете в коммерческой среде, можете перевести гораздо больше, чем стоимость контроль. Кроме того, они выглядят намного лучше и предлагают лучшую функциональность, чем стандартный элемент управления сетью WinForms.

0

Я не знаю характера нулевой точки, которую вы хотите отобразить, но для быстрого выполнения System.Windows.Forms.DataGridView хорошо выполняет эту работу и внедряется в .Net Framework 2.0.

Если вы привыкли работать с Linq для SQL классов, если вы используете SQL Server в качестве хранилища данных, просто создать диаграмму DBML и:

  1. Добавление источника данных;
  2. Из окна инструмента источника данных выберите отображение в виде сетки и перетащите его на форму;
  3. Редактируйте столбцы и переупорядочивайте их так, как вы хотите, чтобы они отображались для вашего клиента;
  4. В коде установите DataGridView.DataSource = someObject.GetList(), который вернет IList объекта, который вы хотите отобразить в этой сетке.

Для этого требуется всего лишь десять строк кода и несколько временных рамок Windows Forms. Надеюсь, я не забыл ничего важного. :-P

Пожалуйста, сообщите, помогает ли это!

+0

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

0

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

someObject.GetList().ForEach((so) => { 
    ConstructorInfo ctor = so.EditingControl.GetType().GetConstructor(new Type[] { }); 
    var editingControl = ctor.Invoke(new object[] { }); 
    editingControl.Name = "someName" + ++counter.ToString(); 
    editingControl.Location = new Point(posX, posY); 
    editingControl.Width = someWidth; 
    editingControl.Height = someHeight; 
    editingControl.DataSource = so; 
    myForm.Controls.Add(editingControl); 
}); 

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

Надеюсь, это поможет!

0

Для меня это похоже на отличное упражнение в элементах управления, которые сами по себе окрашены. Вместо того, чтобы создавать текстовые поля, переопределять/подписываться на событие OnPaint и использовать объект Graphics в DrawString() в соответствующих местах, DrawRectange() имеет вокруг них прямоугольники. Если вы знаете позицию для своих текстовых полей, существующий код будет довольно легко конвертировать.

Некоторые советы:

  1. для первой версии: не заморачиваться с ограничением чертежа в видимой части контроля (я думаю, вы будете нуждаться в некоторых прокрутки здесь)
  2. для (1) - графика будет делать вырезку для вас, и вы можете позаботиться о нем вручную, как только вы убедитесь, что у вас есть правильный макет и правильные данные на экране
  3. использовать двойную буферизацию для уменьшения мерцания всеми средствами
  4. использование солнцезащитного

Оставить комментарий, может быть отправлено на ...

+0

Как это будет работать конкретно? Я знаю концепции проектирования и рисования UserControl и переопределения метода Paint(), чтобы придать ему внешний вид, поэтому это кажется немного запутанным, когда речь идет о графике для меня. Любой образец кода и дальнейшие объяснения будут оценены, если вы хотите поделиться некоторыми. Спасибо! –

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