我正在使用c#组合框控件,我希望允许用户输入新值。即我有DropDownStyle = DropDown。例如,我有一个组合框,允许用户选择/输入国家代码。在加载表单时,我通过查询数据库以查找国家/地区的代码和displaytext来设置组合框的数据集。用户可以选择现有的国家/地区代码或输入新的代码。请不要问为什么我不能使用所有可能的国家代码预先填充组合框,因为它是一个不经常更改的有限集,这是客户要求,此外还有几个这样的控件(测试中心等)。
现在组合框的工作方式是,如果用户键入新条目,我将新值添加到数据库并刷新数据集。我这样做,所以新条目在数据库中有一个适当的唯一代码。虽然这不是一个频繁的操作,但这会减慢应用程序的速度。目前我还将AutoCompleteMode属性设置为SuggestAppend。这是为了防止用户添加重复条目或输入现有条目的拼写错误。
这方面的最佳做法是什么?在内存中添加新条目并在以后将它们添加到数据库中是否更好?它是一个多用户应用程序,也可能是其他人也可以添加相同的条目,尽管很少见。
这是在WinXP上运行的Windows窗体应用程序,有一天可能在Win7上运行,都是32位。
答案 0 :(得分:2)
我认为您通过向数据库添加新条目并刷新datasource
来正确执行此操作。当然,在添加之前,您需要检查数据库中是否已存在该条目,因为它可能是在其最后一个请求发出后由另一个用户添加的。它不应该花太长时间..但这取决于你的结果集。我在我的应用程序中将此技术用于组合框,目前有314个条目,类似的设置,并且它工作得很好。没有来自客户的问题或投诉(尚未)。也许您的停机时间不在技术中,而是在实施或其他地方。
如果您有许多条目(数千或其他任何可能),或许另一种解决方案更合适。但是为了你的目的,这应该足够了。
答案 1 :(得分:0)
因为用户不需要关心插入到数据库中,所以可以使该部分与主UI异步发生。这样可以防止UI速度变慢。如果您正在使用.NET 4,请查看TPL库。
至于如何处理并发性,我建议您使用数据库中的一个过程,该过程将首先使用事务(或等效物)进行选择,如果不存在则插入。无论哪种情况,它都可以返回唯一的ID。
答案 2 :(得分:-1)
你不能添加一个try catch来检查当前列表与新添加的列表吗?
如果存在某种东西 不要插入 否则插入