我正在编写一个.NET WinForms应用程序,它需要以一种格式化的用户友好方式显示结果列表。这是我希望显示数据的方式。
alt text http://img398.imageshack.us/img398/4336/imgdyu.png
该表必须支持相当数量的数据(> = 200个单独的“数据块”),并且需要相当快。我不确定实现这一目标的最简单方法,我希望得到一些指导和建议。我创建了一个快速原型自定义控件,它简单地使用了一堆堆叠在一起的文本框。它运行得相当不错,但是Windows的文本框处理速度太快了。我可以创建一个自定义文本框控件,但这将耗费时间,我想知道是否有任何替代解决方案的建议?感谢。
答案 0 :(得分:3)
你可以使用第三方控件(也许),但这里有一些原因可能是一个坏主意:
对于任何与众不同的事情(比如你正在做的事情),编写自己的UserControl是最好的方法,因为这些(以及其他)原因:
您的特定问题(在您的问题中有详细描述,感谢图形)很容易做,因为大多数是所有者绘制的UserControl(带有TextBox或两个混合)。 System.Drawing.Graphics对象中唯一需要的方法是DrawRectangle,FillRectangle,MeasureString和DrawString。您甚至不需要任何文档,因为Intellisense会为您提供所需的一切。
如果你遇到麻烦,我会为你写一块巧克力饼干。 :)
更新:由于您需要全部可选文本,这使得此方法更复杂一些。实现自己的文本框类型功能是一个巨大的痛苦,但一个相对简单的解决方案是在用户点击任何包含文本的矩形顶部添加一个真正的多行文本框,并放置矩形的文本(预选)进入文本框。当此临时文本框失去焦点(LostFocus)时,您将编辑后的文本绘制到矩形中并删除文本框。这样,您在UserControl中一次只能有一个文本框。
这个版本将花费你两个饼干。
更新2 :这是一个simple application,演示了如何使用单个TextBox使整个控件可选择和可编辑。这是source code。
答案 1 :(得分:0)
您可以使用WinForm Grid控件来实现该控件,或任何第三方网格或列表组件。
带有数据模板的WPF ListBox也可以实现类似的行为。
答案 2 :(得分:0)
来自 Visual Basic PowerPack 的DataRepeater
是否适合您?它是VS2k5的下载,并与VS2k8一起安装。如果没有,请查看www.codeproject.com/KB/cpp/TemplateListBox.aspx上的TemplateListBox
和blogs.vbcity.com/hotdog/archive/2006/10/26.aspx上的ContinousControl
。
答案 3 :(得分:0)
在不了解更多关于数据类型的情况下,我认为您需要一个用户控件,它将是“重复”位。您可以使用TableLayout容器控件(或者可能是FlowLayout?)并根据需要在表中添加/删除项目。
如果您的数据是表格式的,也许是父/子关系,我会说您应该使用网格控件。我不同意这里的另一个答案的陈述,即你应该避开第三方控制。它们可以非常快速地节省您的时间 - 有些像Janus的GridEx控件一样,成本相对较低(几百英镑)并且可以节省您的时间 - 如果您在商业环境中工作,这可以转化为远远超过成本控制。此外,它们看起来更好,并提供比标准WinForms Grid控件更好的功能。
答案 4 :(得分:0)
我不知道您希望显示的数据的性质,但为了快速完成,System.Windows.Forms.DataGridView可以很好地完成工作并嵌入到.Net Framework 2.0中。
如果您习惯使用Linq to SQL Classes,如果您使用SQL Server作为数据存储区,只需创建DBML图并:
这只需要大约十行代码和一些Windows窗体设计时。我希望我没有忘记任何至关重要的事情。 :-P
请告知是否有帮助!
答案 5 :(得分: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);
});
好吧,我希望你能得到这个想法。作为一种解决方案,这不是最优的,但无论如何,以我的谦卑观点来看,这是非常好的。
希望这有帮助!
答案 6 :(得分:0)
对我而言,这似乎是一种自我绘制的控件。而不是创建文本框,覆盖/订阅OnPaint事件并在适当的位置使用Graphics对象到DrawString(),DrawRectange()在它们周围有矩形。如果您知道文本框的位置,现有代码将很容易转换。
一些建议:
随时提出更多问题的评论......
答案 7 :(得分:-2)
如果这是一个Web应用程序:
此数据是否可在页面中编辑,还是仅用于显示目的?如果是前者,请考虑使每个项目成为一个新编辑器页面的链接,该页面将一次编辑一个块。
如果仅显示没有编辑功能的数据,请使用转发器控件输出HTML表。看看
http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/repeater.aspx
转发器绑定到任何数据源 - List<>,Array,DataTable等 - 并遍历内容,并根据您在aspx中指定的模板显示每行的数据。
如果这是一个winForms应用程序
问问自己为什么您的应用程序不是基于Web的。 (我非常谦虚地认为)现在很少有应用程序更适合winForms实现。图形编辑器,编译器等都是很好的例子。但是,报告引擎很可能更适合Web实施。 YMMV。
如果您仍然使用WinForms,更好的解决方案可能是为您的文本使用标签或其他免提控件。如果您需要编辑每个条目,请链接到另一个表单。任何包含数千个文本框的页面都将提供有限的可用性。