天道酬勤,学无止境

数据更改时刷新组合框的首选方法是什么?(What is the preferred method of refreshing a combo box when the data changes?)

问题

数据更改时刷新组合框的首选方法是什么?

如果表单已打开且组合框数据已加载,您如何刷新组合框的内容而不必关闭并重新加载表单?

你必须对组合框上的 Click 事件做些什么吗? 如果每次有人单击组合框时都会对数据库进行命中,这似乎是应用程序的潜在减慢速度。

回答1

您必须确定:

1)你的数据什么时候改变?

如果它依赖于其他用户的活动,因此您无法在不查询数据库的情况下确定它是否已更改,您可以找出刷新的最佳时间,例如表单加载或每次单击,或者您可以使用计时器控件来刷新特定时间的数据。

2) 你的用户什么时候需要知道这个变化?

尝试了解用户了解更改的紧迫性。 跟他们说。 根据这一点,决定何时需要刷新数据。

最后:

没有这样做的正确方法。 这取决于软件结构、用户需求和特定情况。

希望能帮助到你。 祝你好运!

更新:

我可以添加一个我最近使用的解决方案。 如果有什么不清楚的,就问吧。

我假设您从MS SQL Server刷新了组合。

如果是这样的话,

1.创建一个表,在其中存储 Combo 的数据更改日期或版本。

2. onClick 事件或使用计时器控件,它将每 5 分钟(或任何其他时间)检查更改,您可以将组合的上次更改日期(或版本)与我们最后存储的表中的上次更改(或版本)进行比较日期(或版本),并且仅当日期(或版本)发生更改时,才刷新组合。

3.您可以将最后日期(或版本)存储在变量或文本框控件中,每次刷新组合时更改其值。

4.如果数据发生变化,则更新该表中的最后日期(或版本)。

在这种情况下,您只需要检查更改,而不是更新它们。

PS如果此解决方案不适合您,请在每次单击事件时刷新。 对于这种情况,没有比这更好的事件了。

回答2

取决于有多少人将使用表单,但在正常情况下,使用选择框的 onclick 事件是可以的。 使用 ajax 调用很好,因为这意味着您不必加载整个页面。

回答3

有一点很明显,您使用 Dropdown 意味着不需要在 dropdowm 中加载更多项目,我认为大约 20 或 30 个左右。那么,数据库调用有什么问题? 创建将使用执行计划并为您提供快速结果的程序。 或将您需要加载到缓存中的表放在缓存中,如果数据发生更改,则在特定时间填充缓存,然后在下拉列表中加载数据。 我在 Window 应用程序中工作,我面临同样的事情,但没有更好的选择,然后调用数据库或将其放入缓存中。

回答4

我可以看到两种方法:

  1. 在 UI 中放置一个“刷新”按钮并仅在用户单击该按钮时重新加载数据。 用户应该清楚(描述性标签、消息框或其他任何内容)通过点击刷新其当前选择可能会改变。

  2. 监视数据库中组合基础表的数据更改。 当数据更改时,UI 可能会立即更新或仅存储有关数据已更改的标志(稍后会详细介绍)。 为了快速知道数据何时发生变化,数据库触发器对我来说似乎是最好的解决方案:触发器(UPDATE、INSERT、DELETE)设置在组合的基础表上,并在仅为此目的而创建的单独表。 每次重新填充组合(包括表单加载)时,计数器的值都会附加(标记?)到它,以与当前数据库值进行比较。 获取当前计数器值可以在计时器上完成。

现在,如果两个计数器不同,则有两种选择:

A. 立即更新 UI。 我通常会讨厌这样的 UI,但是,不知道您的实际需求是什么,这可能是一种选择。

B. 设置 UI 应该更新的标志。 在下拉事件中,检查标志:如果已设置,则从重新填充组合开始。

在大多数情况下,我根本不会进行任何刷新或使用第一个解决方案,但这实际上取决于要求。

哈。

编辑:

触发器/计数器设置的目的不仅是为了获得变化的信息快,但真正知道,如果数据发生变化,这将是更加复杂的直接查询底层表来完成。 抱歉,如果这在我最初的帖子中(甚至在添加之后)不清楚,但英语不是我的母语。

回答5

问题 1:每个项目的ComboboxName.ClearComboboxName.Items.AddItem

问题 2:当然,这取决于数据更改的频率和列表的大小,但我可能会设置一个每分钟左右设置的计时器。 这将防止对数据库的太多点击,并确保您的表单不会花费太多时间将值填充到组合框。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Entitymanager.flush()与EntityManager.getTransaction()。commit-我应该首选什么?(Entitymanager.flush() VS EntityManager.getTransaction().commit - What should I prefer?)
    问题 更新数据库时我更喜欢什么? 哪种方法的优缺点是什么,什么时候应该使用另一种方法? public void disemployEmployee(Integer employeeId, Date endDate) { Employee employee = (Employee)em.find("Employee", employeeId); employee.getPeriod().setEndDate(endDate); em.flush(); } public void disemployEmployee(Integer employeeId, Date endDate) { Employee employee = (Employee)em.find("Employee", employeeId); em.getTransaction().begin(); employee.getPeriod().setEndDate(endDate); em.getTransaction().commit(); } 回答1 在第一个示例中,对数据的更改在遇到刷新后会反映在数据库中,但仍在事务中。 但是在第二个示例中,您将立即提交事务。 因此,对数据库所做的更改以及事务也在那里结束。 有时,刷新可能有助于将数据保留在正在进行的事务之间,然后最终提交更改。 因此,如果以后发生问题,例如批量插入
  • 如何刷新列表框的数据源(How to refresh DataSource of a ListBox)
    问题 窗体具有一个组合框和一个列表框。 单击“添加”按钮时,我想将选定的项从ComboBox添加到ListBox。 public partial class MyForm:Form { List<MyData> data = new List<MyData>(); private void ShowData() { listBox1.DataSource = data; listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Id"; } private void buttonAddData_Click(object sender, EventArgs e) { var selection = (MyData)comboBox1.SelectedItem; data.Add(selection); ShowData(); } } 在此示例中,所选项目将替换为ListBox中的新选择。 我需要将该项目添加到列表中。 我的代码有什么问题? 回答1 listbox1.DataSource属性用于查找值更改,但是通过始终分配相同的列表,值不会真正更改。 您可以使用BindingList<T>而不是List<T>来自动识别添加的新项目。 您的ShowData()方法必须在启动时被调用一次。 public partial class
  • 为什么在Java中首选使用列表而不是数组?(Why is it preferred to use Lists instead of Arrays in Java?)
    问题 许多人和作者建议我们使用列表而不是数组。 List <Integer> list = new ArrayList<Integer>(); list.addElement(1); .... 它背后的原因是什么? 回答1 通常,您应该更喜欢为工作选择正确的数据结构。 您需要了解手头的任务以及所有不同的选项,以及它们如何在迭代,搜索,添加,删除和插入数据方面进行比较。 通常,您需要了解数据结构如何访问和操作内存,并根据对应用程序的预期使用来选择最佳的数据结构。 显然,它并不总是很明确。 但是您可以了解不同数据结构的理想选择。 例如,只需要迭代而无需搜索的纯静态,固定长度的数据就非常适合数组。 在密码算法中使用此类数组是很常见的。 如果数据是静态的,而不是进行迭代,则需要搜索,您可能需要某种类型的树结构。 如果要快速插入,则散列可能是理想的选择。 如果数据经常更改,则需要一种可以有效更改其大小的结构,例如列表。 当然,数据结构有许多变体和组合,旨在解决各种特定问题。 之所以这么多,是因为它们在编写高效程序中发挥着重要作用。 无论如何,我的观点是了解数据结构。 了解每种情况的理想情况,然后就可以为任何任务决定或设计合适的数据结构。 回答2 从数组vs ArrayList 当您事先不了解元素编号时,使用ArrayList比使用Array更好。 ArrayList比Arrays慢。 因此
  • 您首选的php部署策略是什么? [关闭](What is your preferred php deployment strategy? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我正在用PHP开始一个新项目,很想从其他开发人员那里获得一些有关他们首选的PHP部署策略的反馈。 我想稍微自动化一些事情,以便一旦提交更改,便可以将它们快速迁移到开发或生产服务器。 我有使用Capistrano和Ruby进行部署以及一些基本的shell脚本的经验。 在我独自潜水之前,很高兴听到其他人在他们的项目中是如何做到这一点的。 更多的信息 当前,开发人员在站点的本地安装上进行工作,并将更改提交到Subversion存储库。 通过从svn导出标记的发行版并将其上传到服务器来进行初始部署。 通常,通过手动上传更改的文件来逐步进行其他更改。 回答1 对于PHP,采用Phing构建脚本的SVN是可行的方法。 Phing与ANT类似,但是是用PHP编写的,这使得PHP开发人员可以更轻松地修改其需求。 我们的部署例程如下: 每个人在工作时都在同一台本地服务器上进行开发,每个开发人员也都在自己家里的计算机上结帐。 提交会触发提交后挂接,该挂接会更新登台服务器。 如果测试通过,则在登台服务器上运行测试-继续。 Phing构建脚本已运行: 关闭生产服务器
  • 部分刷新的面板中有条件隐藏的编辑框(Conditionally hidden edit box in a partially refreshed panel)
    问题 我的自定义控件由面板内的多个组合框和文本输入框组成。 组合框的值相互依赖,因此当一个组合框发生变化时,会在面板上执行部分刷新以刷新其他组合框的值。 文本输入框之一也依赖于组合框之一 - 假设组合框标题是“您有任何特殊要求吗?” 并且值为“是”和“否”。 如果值为“No”,则 special_requirements 文本框被隐藏,并在 querySaveDocument 事件中作为“N/A”保存到文档中。 如果值为“Yes”,则显示 special_requirements 文本框,用户必须填写它,并保存他们的输入。 我一直遇到的问题是,如果我计算文本框的“可见”属性的值,那么它会被适当地显示/隐藏,但是每当面板刷新时,任何用户输入都会被清除 - 例如用户选择“是”,输入一些文本,然后更改导致部分刷新的另一个组合框 - 文本框仍显示,但现在为空。 目前我正在使用一种解决方法,而不是计算“可见”属性,而是计算 CSS 样式,在不需要文本框时将其设置为隐藏。 然而,这意味着即使在组合框中选择“否”,用户也可以输入它,因此它不是理想的解决方案。 有没有办法在刷新之间保留用户以前的输入,如果使用“可见”属性将组合框选项从“是”更改为“否”,则将其删除? 回答1 假设 Naveens 示例与您的示例存在相同的问题,那么 JSF 生命周期存在一个简单的问题:如果组件在更新模型阶段不可见
  • 为什么(Excel VBA)组合框更改事件会在每次引用其属性之一时触发?(Why is a (Excel VBA) combobox change event triggering every time one of its properties is referenced?)
    问题 我是该论坛的首次用户。 这是我的情况:在一个用户窗体上,我有一个组合框,两个文本框和一个“确定”按钮。 当用户从组合框的下拉列表中进行选择时,将触发组合框的change事件,并且事件处理代码会根据用户的选择将工作表中的信息填充到文本框中。 然后,用户可以在一个或两个文本框中编辑信息。 然后,用户点击“确定”。 然后,单击OK按钮的click事件,将修改后的信息从文本框中写回到工作表中的单元格中。 似乎很简单。 这是我的问题:组合框的change事件似乎在每次引用其属性时触发。 具体而言,下面的cb_CustomersUpdateOK_Click()子例程中的三个实例引用了组合框的ListIndex属性。 我在“更改”事件代码中放置了一个Msgbox,以指示事件何时触发。 在OK单击事件代码中的三个Assign语句中的每个处使用断点,组合框在三个语句的每个处触发(显示Msgbox)。 触发时,它将使用组合框选择中的初始数据覆盖文本框中的编辑信息。 (1)为什么组合框更改事件触发其方式? (2)我应该怎么做才能防止这种情况发生? 在过去的几个小时中,我一直在进行研究,但没有发现任何有用的东西。 任何帮助将不胜感激。 请让我知道是否需要更多信息。 Private Sub combo_CustomersUpdateLastName_Change() MsgBox "combobox
  • 比继承更偏爱组成?(Prefer composition over inheritance?)
    问题 为什么更偏重于继承而不是继承? 每种方法都有哪些取舍? 什么时候应该选择继承而不是组成? 回答1 优先考虑组成而不是继承,因为它在以后更容易延展/更容易修改,但不要使用总是组合的方法。 通过组合,可以轻松地通过“依赖注入/设置器”即时更改行为。 继承更加严格,因为大多数语言不允许您从一种以上的类型派生。 因此,一旦从TypeA派生,鹅或多或少就会被煮熟。 我对以上的酸测试是: TypeB是否要公开TypeA的完整接口(所有公共方法不少于此),以便可以在需要TypeA的地方使用TypeB? 表示继承。 例如,塞斯纳(Cessna)双翼飞机将展示飞机的整个界面,甚至更多。 因此,它很适合从飞机中派生。 TypeB是否只希望TypeA公开某些/部分行为? 表示需要组成。 例如,鸟类可能只需要飞机的飞行行为。 在这种情况下,将其提取为接口/类/两者并使其成为这两个类的成员是有意义的。 更新:刚刚回到我的答案,现在似乎没有完整提及Barbara Liskov的Liskov替代原则,这是不完整的,以检验“我是否应该继承这种类型?” 回答2 认为遏制是有关系的。 汽车“具有”发动机,人“具有”名称,等等。 想继承的作为是有关系的。 汽车“是”车辆,人“是”哺乳动物,等等。 我不相信这种方法。 我直接从Steve McConnell撰写的第二版Code Complete的6
  • 在数据库中存储密码的首选方法(Preferred Method of Storing Passwords In Database)
    问题 在数据库(最好是SQL Server 2005)中存储密码的首选方法/数据类型是什么。 我在几个应用程序中所做的工作方式是,首先使用.NET加密库,然后将它们作为二进制文件(16)存储在数据库中。 这是首选方法,还是我应该使用其他数据类型或分配比16多的空间? 回答1 我将密码的加盐哈希值存储在数据库中,而不是密码本身,然后始终将哈希值与用户传入的值之一进行比较。 将文字密码数据存储在任何地方都太危险了。 这样就无法恢复,但是当有人忘记或丢失密码时,您可以运行一些检查并创建新密码。 回答2 首选方法:永远不要在数据库中存储密码。 仅散列。 加盐调味。 回答3 除了将其存储为String之外,我还执行与您描述的相同的操作。 我Base64编码加密的二进制值。 要分配的空间量取决于加密算法/密码强度。 我认为您做对了(假设您使用了食盐)。 回答4 存储加盐密码的哈希,例如bcrypt(nounce + pwd)。 您可能更喜欢bcrypt而不是SHA1或MD5,因为可以将其调整为CPU密集型,从而使蛮力攻击的方式更长一些。 在几次登录错误后将验证码添加到登录表单中(以避免蛮力攻击) 如果您的应用程序具有“忘记密码”链接,请确保它不通过电子邮件发送新密码,而是应将其发送到(安全)页面的链接,以允许用户定义新密码(可能仅在确认后)一些个人信息,例如用户的出生日期)。 另外
  • 字段值更改时刷新查询驱动的组合框值吗?(Refresh query-driven combo box values when field value changes?)
    问题 我在窗体上有一个组合框,其中的值是根据单独字段中的值填充的。 为此,我创建了一个组合框并设置“行源”以运行SQL语句。 我遇到的问题是,如果字段中的数据发生更改,则组合框的值不会更新。 如何获得重新运行查询的权限? 回答1 查看此描述是否与您的情况相当接近。 我的表单有一个文本框txtFoo和一个组合框cboBar 。 cboBar的行源属性是一个引用txtFoo的查询。 我想响应txtFoo更改来更新组合的内容。 解决方案是在更新事件之后从txtFoo's cboBar重新查询。 Private Sub txtFoo_AfterUpdate() Me.cboBar.Requery End Sub 回答2 过去我遇到过Requery无法正常工作甚至挂起的问题。 它不是很漂亮,但您可能想尝试一下: Me.cboBar.RowSource = "" Me.cboDemoUnit.RowSource = "your SQL statement" 回答3 这是我最近为做同样的事情所做的一个示例,这应该会有所帮助! 它在afterupdate子中。动态组合框的示例
  • 使用 bindingsource 更新具有组合框的 datagridview(Update a datagridview having combobox with bindingsource)
    问题 我正在使用 Vb.Net 从 sql server 数据库加载数据。 我有汽车数据表如下: 我按如下方式加载汽车详细信息和不同的模型值: sql = " select * from car" daCar = New SqlDataAdapter(sql, sqlConn) daCar.Fill(dsDataset, "car") sql = " select distinct model from car" daCar = New SqlDataAdapter(sql, sqlConn) daCar.Fill(dsDataset, "model") 现在,当我加载表单时,我有两个 bindingsources 并有一个组合框来显示模型的不同值,因此用户汽车可以轻松修改数据 bsCar = New BindingSource(dsDataset, "car") bsModel = New BindingSource(dsDataset, "model") dgvCars.DataSource = bsCar Dim col2 As New DataGridViewComboBoxColumn col2.HeaderText = "Model" col2.Name = "model" col2.DataSource = bsModel col2.DisplayMember =
  • 如何获取 Microsoft Access 表单以刷新计算列?(How do you get a Microsoft Access form to refresh a computed column?)
    问题 我有一个 Microsoft Access 表单,该表单绑定到具有计算列的链接 SQL Server 表。 我有一个绑定到计算列的控件。 我已经意识到在保存记录之后才能刷新计算字段。 除此之外,在保存后刷新绑定到计算列的文本框的最佳方法是什么。 我不想做 me.requery (重新查询整个记录集)。 有没有办法只刷新那个字段? 回答1 编辑清晰:实际上有一些策略需要考虑。 Form.Refresh()将刷新您的表单的记录源,捕获对现有记录的修改和删除,并将保持在当前记录上。 但是,您不会看到自打开表单以来添加的任何新记录。 Form.Requery()将重新运行表单的记录源查询。 您将看到所有 Form.Refresh() 更改,并且它会显示任何新记录。 在 UI 上,Form.Requery() 重新定位到第一条记录。 Form.Control.Requery()与Form.Refresh()类似,因为您不会更改记录位置或查看新记录。 假设控件基于查询/表,它将更新您的控件。 您需要确保触发事件涉及数据库更新。 在某些情况下,控件的 AfterUpdate() 位于数据库 I/O 之前,这对您没有帮助。 回答2 谢谢你们。 这是什么工作。 在 Form AfterUpdate 事件中,我做了一个 Me.ControlName.Requery。 这是完美的
  • 与规则引擎交互的首选方法(Prefered methods for interacting with a rules engine)
    问题 我即将进入一个面向规则的项目(使用 ILOGs Rules for .NET - 现在是 IBM)。 我已经阅读了一些关于如何设置规则处理以及如何与规则引擎交互的不同观点。 我看到的两个主要想法是将规则引擎集中(到它自己的服务器群中)并通过 Web 服务 API(或在 ILOG 的情况下通过 WCF)针对该群进行编程。 另一方面是在每个应用服务器上运行规则引擎的一个实例,并在本地与它进行交互,每个实例都有自己的规则副本。 集中化的好处是可以轻松地将规则部署到集中位置。 规则会根据需要进行扩展,而不是在每次扩展应用程序服务器配置时进行扩展。 从购买许可证的角度来看,这减少了浪费。 这种设置的缺点是增加了进行服务调用、网络延迟等的开销。 本地运行规则引擎的优点/缺点与集中式配置的优点/缺点完全相反。 没有缓慢的服务调用(快速的 API 调用),没有网络问题,每个应用服务器都依赖它自己。 管理规则的部署变得更加复杂。 每次向应用云添加节点时,您都​​需要更多的规则引擎许可证。 在阅读白皮书时,我看到亚马逊正在为每个应用服务器配置运行规则引擎。 他们似乎对规则进行了缓慢部署,并认识到即使业务逻辑在给定时间段内不同步,规则发布的滞后也是“可以接受的”。 问题:根据您的经验,对于尚未在规则驱动的世界中工作的商店,开始将规则集成到基于 .net 的 Web 应用程序的最佳方法是什么?
  • 在同一系统上的两个应用程序之间传递数据的首选方式是什么?(What is the preferred way of passing data between two applications on the same system?)
    问题 我有一个应用程序(A),需要启动另一个应用程序(B)。 我需要在应用程序之间传递数据。 我可以想到两种方法。 首先是打开一个插座。 第二个是通过dll共享数据。 打开插座的方法是直截了当的。 dll的方法我有一些疑问吗? 我可以将插件dll加载到B中。我想创建一个A可以用来将数据传递给B的dll。加载dll时,仅加载了dll的一个实例吗? 如果是这样,是否意味着可以在加载dll的应用程序之间共享数据? 有什么更好的选择? 还有其他方法吗? 回答1 您无法通过DLL有效地共享数据。 其他方法: 磁盘文件管道共享内存讯息 RPC 科巴通讯等等。 回答2 最简单的方法(假设您提到了DLL,便是Windows)可能是使用CreateProcess并打开到子进程的管道,如此处简化形式所述:http://msdn.microsoft.com/zh-cn/library/ms682499 .aspx 命名管道可以替代,特别是如果您无法控制所有流程的生命周期。 http://msdn.microsoft.com/en-us/library/aa365590.aspx 对于简单的情况,邮筒可能是一个足够的选择。 http://msdn.microsoft.com/zh-CN/library/aa365574.aspx#base.using_a_mailslot_for_ipc
  • 在 SQL 数据库中存储自定义字段的首选方法是什么?(What is the preferred way to store custom fields in a SQL database?)
    问题 我的朋友正在开发一种产品,供不同的独立医疗单位使用。 该数据库存储了在不同时间进行的大量测量值集合,例如温度、血压等... 让我们假设这些是用一种称为表举行exams与列temperature , pressure ,等等...(以及id , patient_id和timestamp )。 大多数测量值存储为浮点数,但有些是其他类型(字符串、整数...) 虽然这些测量中有许多是由他们的产品处理的,但它需要允许不同的医疗单位记录和处理其他自定义测量。 一个非常漂亮的用户界面允许管理员编辑这些海关字段,指定它们的名称、类型、可能的值范围等...... 他不确定如何存储这些自定义字段。 他倾向于一个单独的表(比如一个表custom_exam_data与字段像exam_id , custom_field_id , float_value , string_value ,...) 我担心这会使搜索更难实现且效率更低。 我倾向于直接修改考试表(同时避免列名与某些方案的冲突,例如在所有自定义字段前面加上下划线或将它们命名为 custom_1,...) 他担心动态修改数据库并为每个医疗单位使用不同的模式。 希望有更多经验的人可以在这个问题上权衡。 笔记: 他正在使用 Ruby on Rails,但我认为这个问题几乎与框架无关,除了他仅在 SQL 数据库中寻找解决方案这一事实。
  • 对数据绑定组合框进行排序的最佳方法是什么?(What is the best way to sort a data bound combo box?)
    问题 我对此进行了一些研究,似乎对数据绑定组合框进行排序的唯一方法是对数据源本身进行排序(在本例中为 DataSet 中的 DataTable)。 如果是这种情况,那么问题就变成了对 DataTable 进行排序的最佳方法是什么? 组合框绑定在设计器初始化中使用 myCombo.DataSource = this.typedDataSet; myCombo.DataMember = "Table1"; myCombo.DisplayMember = "ColumnB"; myCombo.ValueMember = "ColumnA"; 我试过设置this.typedDataSet.Table1.DefaultView.Sort = "ColumnB DESC"; 但这没有区别,我尝试在 typedDataSet.Merge 调用之前和之后在控件构造函数中设置它。 回答1 如果您使用的是 DataTable,则可以使用 (DataTable.DefaultView) DataView.Sort 属性。 为了获得更大的灵活性,您可以使用 BindingSource 组件。 BindingSource 将是您的组合框的数据源。 然后,您可以将数据源从 DataTable 更改为 List,而无需更改组合框的 DataSource。 BindingSource 组件有多种用途。 首先
  • 如何在子表单打开时冻结父表单(How to freeze Parent Form while Child Form is open)
    问题 我有一种情况,在某些情况下,我需要打开另一个表单并保持该表单的焦点(模态 = 真),当它们不存在并关闭时,父表单上的控件会使用可能已更改的可能数据刷新. 最初,我有一个方法可以在子窗体打开时执行DoEvents ,但它会导致几个子窗体无法用于数据输入/编辑(它们没有在窗体级别进行数据绑定)。 ShowForm 方法 - 最初 Public Sub ShowForm(par As Form, nm As String, _ Optional whr As String = "", _ Optional args As String = "", _ Optional mode As AcFormOpenDataMode = acFormPropertySettings) DoCmd.OpenForm nm, acNormal, , whr, mode, , args While IsOpen(nm) DoEvents Wend End Sub 为了让子窗体始终可用,我不得不注释掉While...Wend循环。 我是否可以在此方法中或调用控件的 OnClick 中使用另一种逻辑模式,这样当他们关闭子窗体时,我可以在关闭子窗体后执行代码? 回答1 最简单的方法是在对话框模式下简单地打开表单。 例如, DoCmd.OpenForm nm, acNormal, , whr, mode
  • 设计数据库时,存储多个真/假值的首选方法是什么?(When designing databases, what is the preferred way to store multiple true / false values?)
    问题 如标题所述,在设计数据库时,处理具有多个列的表的首选方法是什么,这些列仅将真/假值存储为单个值(例如“Y/N:或“0/1”) )? 同样,在不同的数据库(例如 Oracle 和 SQL Server)之间是否会出现一些可能影响列处理方式的问题? 回答1 在SQL Server ,有BIT数据类型。 您可以在那里存储 0 或 1,比较值但不运行MIN或MAX 。 在Oracle ,您只需使用NUMBER或CHAR(1) 。 在MySQL和PostgreSQL任何数据类型都可以隐式转换为BOOLEAN 。 两个系统都支持BOOLEAN数据类型,您可以在WHERE或ON子句中按原样使用,无需运算符: SELECT * FROM mytable WHERE col1 ,这在SQL Server和Oracle是不可能的(您需要在那里有某种类型或谓词)。 在MySQL , BOOLEAN是TINYINT(1)的同义词。 在PostgreSQL也是如此(在存储方面),但从逻辑上讲,它不能隐式转换为任何其他类型。 回答2 根据我自己的经验,我更喜欢 char(1) 代表“Y”或“N”。 使用 0 和 1 可能有点混乱,这取决于我已经喝了多少啤酒,并且 C++ main() 函数在成功时返回 0。 ENUM 和 BIT 类型比它们的价值更麻烦。 有趣的是,MySQL information
  • ComboBox.SelectedValue不从绑定源更新(ComboBox.SelectedValue not updating from binding source)
    问题 这是我的绑定源对象: Public Class MyListObject Private _mylist As New ObservableCollection(Of String) Private _selectedName As String Public Sub New(ByVal nameList As List(Of String), ByVal defaultName As String) For Each name In nameList _mylist.Add(name) Next _selectedName = defaultName End Sub Public ReadOnly Property MyList() As ObservableCollection(Of String) Get Return _mylist End Get End Property Public ReadOnly Property SelectedName() As String Get Return _selectedName End Get End Property End Class 这是我的XAML: <Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml
  • 从服务线程调用 Android Activity 的首选方法是什么(What is the preferred way to call an Android Activity back from a Service thread)
    问题 我目前正在开发具有以下需求的 Android 应用程序: 工作线程在服务中启动。 这个线程做一些处理,需要从主Activity调用,并为同一个Activity提供一些异步应答。 从 Activity 调用服务很容易(IBinder 的东西) 我现在的问题是关于服务回调的正确实现。 我首先要在 Activity 中添加一个 android.os.Handler 并在 MyActivity.handleMessage(Message) 中处理线程的 anwers 但这需要我将此处理程序的引用提供给服务。 那么当 Android 操作系统由于方向改变而决定销毁/重新创建我的 Activity 时会发生什么? 我的活动是否在服务中(间接)引用时保持活动状态? 如果 Activity 无论如何销毁/重建,我的 Handler 在 Service 中的引用会发生什么? 我想我没有使用正确的方法从服务线程回调 Activity,所以我想知道是否有人可以指出我正确的做法。 TIA 回答1 我更喜欢使用 LocalBroadcastManager 以下是您的Activity的代码示例: BroadcastReceiver localBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive
  • 使用“话语提示”时,当TextView的内容已更改时,提醒用户的首选方法是什么?(When using TalkBack, what is the preferred way to alert the user when the contents of a TextView have changed?)
    问题 我有一个解锁屏幕,提示用户输入四位数的密码。 如果用户输入的密码不正确,则会显示以前不可见的TextView并显示一条错误消息。 在这一点上,“话语提示”大声读出错误消息的内容会很有用。 通过一些实验,我意识到我可以在视图上设置android:focusableInTouchMode="true"并以编程方式调用View#requestFocus()。 这是第一次工作,但由于视图已经具有焦点,因此在后续错误上将失败。 通常,覆盖当前视图焦点似乎也不是一个好主意。 然后,当显示错误消息时,我尝试调用View#announceForAccessibility(java.lang.CharSequence)。 显然,如果该视图当前不可见,则此方法将无提示地失败。 没问题,否则效果很好。 但是,它仅在API级别16+(Jelly Bean)中可用,这确实限制了它的实用性。 由于TalkBack支持API级别7+,因此必须有更好的解决方案。 我已经看过2011年和2012年有关可访问性的Google I / O会议,但似乎都没有涉及这个基本用例。 最好的方法是什么? 编辑1: TLDR; 在Jelly Bean中引入View#announceForAccessibility(java.lang.CharSequence)之前,有没有办法强迫TalkBack大声朗读一些文本? 回答1