【问题标题】:In ASP.NET, how to store controls in a Dictionary在 ASP.NET 中,如何将控件存储在 Dictionary 中
【发布时间】:2015-08-11 20:39:10
【问题描述】:

我将 ASP.NET 控件(表格、按钮、文本框)存储在 Web 表单应用程序的字典中,以便可以直接从用户控件访问它们,而不必从其他用户控件中递归搜索它们.当它们被添加到字典中时,我可以验证 .ascx 控件上的可见控件与字典中的对象相同:X == Y 返回 true。但后来,当我想做一些改变背景颜色或禁用按钮等操作时,X == Y 返回 false。我对 Dictionary 中的对象(声明为静态)所做的更改不会反映在可见的 GUI 控件中。

我该如何纠正这个问题?

【问题讨论】:

  • 你能解释一下为什么没有字典就很难访问控件,或者为什么自定义控件需要访问其他控件吗?

标签: c# asp.net dictionary user-controls


【解决方案1】:

(如果没有看到任何代码,并且不了解您想要实现的目标,很难给您一个有用的答案,但是......)

每当进行回发时,都会创建页面的新实例及其所有控件。因此,存储在字典中的控件实例不再与当前页面实例上的控件实例匹配。它们仍然是第一次请求页面时创建的实例。


但无论如何,将控件实例存储在静态字典中是一个非常糟糕的主意(例如,想想当多个用户并行调用您的页面时会发生什么)。

请说明您想要达到的目标以及您认为字典的必要性。然后可能会更容易为您提供帮助。

【讨论】:

  • 感谢您的及时回复。这将是一个单用户应用程序,因此并发访问不会成为问题。我认为字典将消除重复递归搜索的需要。但我现在明白它无法执行该功能。
【解决方案2】:

字典存储有关每个控件的信息。但是,UI 显示的控件是独立的。每次对字典中的一个元素进行更改时,都必须将实际的 UI 组件设置为 = 它们对应的字典元素。所以

Dictionary["textBoxExampleKey"].Text = "blah";

不会改变实际的文本框。要更新文本框以匹配字典中的值,请执行`

textBoxExample.Text = Dictionary["textBoxExampleKey"].Text;

为了简单起见,我建议创建一个更新整个 UI 以匹配字典的方法。所以这个方法类似于

private void UpdateUI()
{
    textBoxExample.Text = Dictionary["textBoxExampleKey"].Text;
    labelExample.Text = Dictionary["labelExampleKey"].Text;
    listBoxExample.DataSource = Dictionary["listBoxExampleKey"].DataSource;
    Refresh();
}

“Refresh()”方法会重新加载您的 UI,以便所有更改都可见,这也可能是您的问题的一部分。

TL;DR:更新您的实际控件,刷新您的 UI。

【讨论】:

  • 感谢您的回复。我现在认为,试图维护一个控件字典将需要更多的维护开销,而不是值得的。我将根据需要进行递归搜索;这不是关键任务、高吞吐量、实时应用程序,只是公司管理层偶尔使用的客户报告和修改应用程序。
  • 是的,它确实只是增加了额外的不必要的复杂性。我也觉得我回答的时候没有完全理解你的问题
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 2010-11-17
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多