需要帮助创建控件来显示数据

我正在编写一个.NET WinForms应用程序,需要以一种很好的格式化用户友好的方式显示结果列表。 这是我希望显示数据的方式。

替代文字http://img398.imageshack.us/img398/4336/imgdyu.png

该表必须支持相当数量的数据(> = 200个单独的“数据块”),并且需要相当快。 我不确定实现这一目标的最简单方法,我希望得到一些指导和建议。 我创建了一个快速原型自定义控件,它简单地使用了一堆堆叠在一起的文本框。 它运行得相当不错,但Windows的文本框处理速度太快了。 我可以创建一个自定义文本框控件,但这将耗费时间,我想知道是否有任何替代解决方案的建议? 谢谢。

你可以使用第三方控件(也许),但这里有一些原因可能是一个坏主意:

  1. 第三方控制需要花钱
  2. 第三方控制倾向于吮吸
  3. 第三方控件要求您至少分发一个额外的DLL,您通常无法控制它
  4. 即使第三方控件最终可以满足您的需求,也需要花费一些时间和精力来弄清楚如何使用它,以及如何将其锤入您需要的形状

对于任何与众不同的事情(比如你正在做的事情),编写自己的UserControl是最好的方法,因为这些(以及其他)原因:

  1. 编写自己的UserControl是您在.Net中可以做的最有趣的事情
  2. 你将不得不学习一些很好的东西,但你获得的知识可以立即转移到其他问题和项目(而无论你学习使用Initrode的无限精彩网格化器只会帮助你使用该特定控件)
  3. 您的申请将无需额外分发
  4. 完全控制源代码
  5. 永远免费(向Evony道歉)
  6. 天空是极限 – 任何第三方控制,你最终会遇到一些它无法做到的事情,但如果你自己做,你可以做任何你想做的事情

您的特定问题(在您的问题中很好地描述,由于图形)很容易做,因为大多数所有者绘制的UserControl(混合使用TextBox或两个)。 System.Drawing.Graphics对象中唯一需要的方法是DrawRectangle,FillRectangle,MeasureString和DrawString。 您甚至不需要任何文档,因为Intellisense将为您提供所需的一切。

如果你遇到麻烦,我会为你写一块巧克力cookies。 🙂

更新 :因为您需要所有文本都可以选择,这使得这种方法更复杂一些。 实现自己的文本框类型function是一个巨大的痛苦,但一个相对简单的解决方案是在用户点击任何包含文本的矩形顶部添加一个真正的多行文本框,并放置矩形的文本(预选)进入文本框。 当此临时文本框失去焦点(LostFocus)时,您将编辑后的文本绘制到矩形中并删除文本框。 这样,您在UserControl中一次只能有一个文本框。

这个版本将花费你两个cookie。

更新2 :这是一个简单的应用程序 ,演示如何使用单个TextBox使整个控件可选择和可编辑。 这是源代码 。

您可以使用WinForm Grid控件来实现该控件,或任何第三方网格或列表组件。

带有数据模板的WPF ListBox也可以实现类似的行为。

Visual Basic PowerPackDataRepeater能为您工作吗? 它是VS2k5的下载,并与VS2k8一起安装。 如果没有,请查看www.codeproject.com/KB/cpp/TemplateListBox.aspx上的TemplateListBox和blogs.vbcity.com/hotdog/archive/2006/10/26.aspx上的ContinousControl。

在不了解更多有关数据类型的情况下,我认为您需要一个用户控件,它将是“重复”位。 您可以使用TableLayout容器控件(或者可能是FlowLayout?)并根据需要添加/删除表中的项目。

如果您的数据是表格式的,也许是父/子关系,我会说您应该使用网格控件。 我不同意这里的另一个答案的陈述,你应该避开第三方控制。 它们可以非常快速地节省您的时间 – 有些像Janus的GridEx控件一样,成本相对较低(几百英镑)并且可以节省您的时间 – 如果您在商业环境中工作,可以转化为远远超过成本控制。 此外,它们看起来更好,并提供比标准WinForms Grid控件更好的function。

我不知道您希望显示的数据的性质,但为了快速完成,System.Windows.Forms.DataGridView可以很好地完成工作并嵌入到.Net Framework 2.0中。

如果您习惯使用Linq to SQL Classes,如果您使用SQL Server作为数据存储区,只需创建您的DBML图表并:

  1. 添加数据源;
  2. 从“数据源”工具窗口中,选择显示为网格,然后将其拖放到表单上;
  3. 编辑列并重新排序,以便为客户显示它们;
  4. 在代码中,设置DataGridView.DataSource = someObject.GetList(),它将返回您希望在此网格中显示的对象的IList。

这只需要大约十行代码和一些Windows窗体设计时。 我希望我没有忘记任何至关重要的事情。 😛

请告诉我们是否有帮助!

如果您自己编写,则可能需要将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); }); 

好吧,我希望你能得到这个想法。 作为一种解决方案,这不是最优的,但无论如何,从我的谦卑观点来看,这是非常好的。

希望这可以帮助!

对我而言,这似乎是一种自我绘制的控件。 而不是创建文本框,覆盖/订阅OnPaint事件并在适当的位置使用Graphics对象到DrawString(),DrawRectange()在它们周围有矩形。 如果您知道文本框的位置,现有代码将很容易转换。

一些忠告:

  1. 对于第一个版本:不要打扰将绘图限制为控件的可见部分(我猜你需要在这里滚动一些)
  2. 对于(1) – 图形将为您做剪辑,一旦确认您在屏幕上有正确的布局和正确的数据,您可以手动处理它
  3. 一定要使用双缓冲来减少闪烁
  4. 使用防晒霜

随意提出更多问题的评论……

如果这是一个Web应用程序:

此数据是否可在页面中编辑,还是仅用于显示目的? 如果是前者,请考虑使每个项目成为一个新编辑器页面的链接,该页面将一次编辑一个块。

如果仅显示没有编辑function的数据,请使用转发器控件输出HTML表。 看一眼

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

转发器绑定到任何数据源 – List <>,Array,DataTable等 – 并遍历内容,并根据您在aspx中指定的模板显示每行的数据。 该

如果这是一个winForms应用程序

问问自己为什么你的应用程序不是基于Web的。 (我非常谦虚地认为)现在很少有应用程序更适合winForms实现。 图形编辑器,编译器等都是很好的例子。 但是,报告引擎很可能更适合Web实施。 因人而异。

如果您仍然使用WinForms,更好的解决方案可能是为您的文本使用标签或其他无句柄控件。 如果您需要编辑每个条目,请链接到另一个表单。 任何包含数千个文本框的页面都将提供有限的可用性。