我想我很清楚BindingSource类的作用 - 即在数据源和UI控件之间提供一个间接层.它实现了IBindingList接口,因此也提供了对排序的支持.而且我经常使用它,没有太多问题.但我想知道我是否经常使用它而不是我应该使用它.也许一个例子会有所帮助.
假设我在表单上只有一个简单的文本框(使用WinForms),我想将该文本框绑定到返回字符串的类中的简单属性.在这种情况下使用BindingSource值得吗?
现在让我说我的表单上有一个网格,我想将它绑定到DataTable.我现在应该使用BindingSource吗?
在后一种情况下,我可能不会使用BindingSource作为DataTable从我可以收集的内容中提供与BindingSource本身相同的功能.当添加,删除行等时,DataTable将触发正确的事件,以便网格自动更新.
但是在第一种情况下,文本框被绑定到一个字符串,我可能会让包含字符串属性的类实现INotifyPropertyChanged,这样它就可以在字符串更改时触发PropertyChanged事件.我会使用BindingSource,以便它可以监听这些PropertyChanged事件,以便它可以在字符串更改时自动更新文本框.
到目前为止这听起来怎么样?我仍然觉得我的理解存在差距,这使我无法看到整体情况.到目前为止,这是一个非常模糊的问题,所以我会尝试提出一些更具体的问题 - 理想情况下,答案会引用上面的例子或类似的东西......
(1)在上述任何一个例子中是否值得使用BindingSource?
(2)似乎开发人员只是"假设"DataTable类在正确的时间触发PropertyChanged事件时会做正确的事情.如何知道数据源是否能够执行此操作?是否存在数据源应该实现的特定接口,以便开发人员能够承担此行为?
(3)在考虑是否使用BindingSource时,控制绑定的是否重要?或者只是影响决策的数据源?也许答案是(这看起来足够合乎逻辑):Control需要足够智能以监听PropertyChanged事件,否则需要BindingSource.那么如何判断Control是否能够做到这一点呢?同样,开发人员可以寻找控件必须实现的特定接口吗?
正是这种困惑在过去导致我总是使用BindingSource.但是我想更好地理解何时使用它,所以我只在必要时这样做.
我有一个Visual Studio 2010解决方案,设置为在Debug x86中构建.因此,Visual Studio将输出路径设置为\ bin\x86\Debug,这似乎足够合乎逻辑.
该解决方案包含约50个项目; 启动项目是一个WCF项目.
当我进行构建时,我希望所有输出dll都转到\ bin\x86\Debug,因为这是在项目设置中设置的.但奇怪的是,我看到在bin\x86\Debug 和\bin中创建了dll .如果输出路径未设置为该目录,为什么Visual Studio会在\ bin中放入任何dll?似乎所有的dll都转到了\ bin\x86\Debug,除了启动项目之外的所有dll 都进入了\ bin.知道为什么会这样做吗?(我们有其他解决方案不使用WCF,他们没有这个问题.)
另一个烦恼是如果我从Visual Studio运行服务,然后尝试在Web浏览器中访问我的服务,通过访问http:// localhost:1240/MyService.svc,它不起作用,因为启动/ bin中缺少项目dll.因此,我必须手动将这个dll从\ bin\x86\Debug复制到\ bin,以便找到所有dll并且服务正常运行.(我们当然可以添加一个自定义的构建后步骤来执行复制,但您认为有更好的方法!)
对于那些在WCF项目上工作的人,您是否将输出路径保留在\ bin\x86\Debug?(也许有一种方法可以配置服务,例如在web.config或.svc文件中,以便它知道二进制文件位于\ bin\x86\Debug而不是\ bin?)或者您是否将输出路径更改为\ bin以便您可以直接从Visual Studio运行您的服务?
我有一个WinForms应用程序,当它第一次启动时,首先创建一个OracleConnection,然后调用一个将记录写入user_session表的存储过程.OracleConnection是一个故意永远不会被处理的类的静态成员,因为我们希望连接在应用程序的生命周期中存在.从本质上讲,这个想法是在任何时候跟踪谁在使用该应用程序.当应用程序关闭时,它会调用另一个存储过程从user_session表中删除该记录.
这一切都运行良好,但我们想要迎合应用程序崩溃的罕见(?)场合,并且我们的user_session表中的记录不会被清除.为此,我们有另一个存储过程来检查Oracle v $会话视图中存在哪些会话,如果它在user_session中找到v $ session中不存在的会话,则会清除user_session中的记录.这似乎也很好用.
但是现在,我们有一个新的WCF服务,托管在IIS 6.它还具有与WinForms应用程序相同的启动逻辑 - 它创建OracleConnection并且在服务关闭之前不会处理它.
但由于某种原因,这项服务在v $ session中的记录正在消失.这种情况相当随机发生,但是经常发生(通常在服务运行几个小时后).这会导致我们的存储过程从user_sessions表中清除服务的会话,而不应该这样,我正在尝试修复它.
所以,关于我的问题:OracleConnections最终会超时,也许是因为它们闲置太久了?如果是这样,这次超时配置在哪里?如果没有,为什么我的会话会从v $ session中删除?
我原以为如果没有处理OracleConnection,那么会话(在v $ session中)会无限期地挂起(或直到进程被关闭/终止).这似乎是WinForms应用程序中的工作方式.但这并不是我们在WCF服务方面的经验:正如我已经解释过的那样,尽管OracleConnection仍然处于打开状态,但会话才会消失.(我已经尝试过监听StateChange事件,如果由于某种原因OracleConnection被关闭,但事件永远不会触发,所以连接肯定仍然是打开的.我们还配置了IIS以不终止空闲进程,所以它是不喜欢在我们不知情的情况下关闭服务.)
提前致谢.
我正在使用C#应用程序中的MS Word进行一些Office自动化,我发现Word有时会挂起.我无法在开发人员环境中重现这种情况,所以我希望通过采用核心转储并使用WinDbg对其进行分析,我可以确切地确定Word的原因.
如果我运行kb,我会得到这个堆栈跟踪(在警告之后我已经将所有内容都留下了,因为它可能无关紧要):
ChildEBP RetAddr Args to Child
003bc94c 762ed846 00037b72 00000008 00000000 user32!NtUserWaitMessage+0x15
003bc988 762eda5c 00047b12 00037b72 00000008 user32!DialogBox2+0x222
003bc9b4 762ed98a 59870000 0089aa30 00037b72 user32!InternalDialogBox+0xe5
003bc9d4 762ed70e 59870000 0089aa30 00037b72 user32!DialogBoxIndirectParamAorW+0x37
003bc9f4 59acdf5e 59870000 0089aa30 00037b72 user32!DialogBoxIndirectParamW+0x1b
WARNING: Stack unwind information not available. Following frames may be wrong.
Run Code Online (Sandbox Code Playgroud)
所以这似乎表明Word正在挂起,因为它显示了一个对话框.如何获取该对话框的内容?
如果我查看地址0089aa30的内存,我会看到:
........................3....
.M.i.c.r.o.s.o.f.t. .W.o.r.d.
........T.a.h.o.m.a..........
....P#.!.*...........O.K.....
...........PW.!.*...........&
.H.e.l.p..................P..
.............................
....P+...r.......M.S.O.U.N.I.
S.T.A.T...W.o.r.d. .c.a.n.n.o
.t. .o.p.e.n. .t.h.e. .e.x.i.
s.t.i.n.g. .f.i.l.e..... .(.N
.o.r.m.a.l.)................@
..+.........M.S.O.U.N.I.S.T.A
.T...2.0.0.5.2.1.............
Run Code Online (Sandbox Code Playgroud)
所以对我来说,这说明对话框中的消息是"Word无法打开现有文件(正常)".
我是在正确的轨道上吗?我在寻找合适的记忆吗?
有没有办法得到消息的确切内存地址?(我觉得我有点猜测,因为上面的消息恰好在内存中接近DialogBoxIndirectParam的参数.)我查看了DialogBoxIndirectParam的MSDN文档,希望弄清楚我应该在内存中的确切位置期待看到对话框的消息,但没有走得太远.
编辑:在看到blabb(绝对不可思议)的答案后,我试图在WinDbg中为我的MS …
.net ×2
wcf ×2
connection ×1
data-binding ×1
ms-word ×1
oracle ×1
session ×1
windbg ×1
winforms ×1