我无法相信我仍然对此感到困惑但是,无论如何,让我们最终指出:
我有一个类覆盖OnPaint来做一些绘图.为了加快速度,我在构造函数中预先创建了笔,画笔等,以便OnPaint不需要继续创建和处理它们.
现在,我确保我总是处理这些对象,但我感觉我不需要,因为尽管它们实现了IDisposable,但它们都是托管对象.
它是否正确?
感谢所有的答案,这个问题肯定已被钉上了.
我很高兴我一直保持警惕,总是使用'使用',所以我不需要经历所有的代码检查.我只想清楚我不是一个毫无意义的用户.
顺便说一句,我确实有一个奇怪的情况,最近,我不得不更换一个使用块并手动调用dispose!我会把它挖出来并创造一个新问题.
如果我通过设置DataSourceUpdateMode = Never来关闭绑定数据源的自动更新然后使用按钮来更新整个批次(使用binding.WriteValue),则会出现问题 - 即,仅更新第一个绑定控件的数据源.所有其他控件将重置为原始值.
这是因为当当前对象发生更改时(如上面的WriteValue之后),如果ControlUpdateMode = OnPropertyChange,则所有其他控件都会重新读取数据源中的值.
避免这个问题的标准方法是什么?
一种方法是从BindingSource派生一个类并添加一个WriteAllValues方法.此方法执行以下操作:
(1)对于每个Binding,保存ControlUpdateMode
(2)对于每个Binding,设置ControlUpdateMode = Never
(3)对于每个Binding,调用WriteValue方法
(4)对于每个Binding,将ControlUpdateMode重置为保存的值
(5)对于每个Binding,如果ControlUpdateMode = OnPropertyChange,则调用ReadValue方法.
你能看到这样做有什么问题吗?
如果使用自己的类,实现IEditableObject会解决问题吗?
在我正在研究的另一个控件中,我实现了自己的绑定.我解决这个问题的方法是使用以下代码.(我已经把它放在最低限度,我希望你能遵循它!):
Private Shared ControlDoingExplicitUpdate As MyCustomControl = Nothing
Private Sub UpdateDataSourceFromControl(ByVal item As Object, ByVal propertyName As String, ByVal value As Object)
Dim p As PropertyDescriptor = Me.props(propertyName)
Try
ControlDoingExplicitUpdate = Me
p.SetValue(item, value)
Catch ex As Exception
Throw
Finally
ControlDoingExplicitUpdate = Nothing
End Try
End Sub
Private Sub DataBindingSource_CurrentItemChanged(ByVal sender As Object, ByVal e As System.EventArgs)
If (ControlDoingExplicitUpdate …Run Code Online (Sandbox Code Playgroud) 我没有得到我希望绑定到业务对象中的整数属性的TextBox的行为.
这是我做的:
(1)将DataSourceUpdateModeTextBox设置为:OnValidation.
(2)如果Validating是TextBox,请设置e.Cancel = TrueInteger.TryParse是否失败.
(3)在处理程序中添加处理程序Binding.Parse并Binding.BindingComplete在处理程序中放置断点.
运行应用程序,将"asdasd"放在TextBox和tab中.尽管设定e.Cancel = True,但事件Parse和BindingComplete事件都被提出.根据文档,设置e.Cancel = True应该抑制任何进一步的逻辑.
我搜索了MSDN,找出为什么会发生这种情况,但我找不到任何东西.有没有人知道我在哪里可以得到一些细节?
ETA:我还为Validated事件添加了一个句柄.这是事件的顺序:
数据不好:
(1)验证.(我设定e.Cancel = True)
(2)解析
(3)BindingComplete
好数据:
(1)验证
(2)解析
(3)BindingComplete
(4)经过验证
ETA2:更多信息和解决方法.
此行为的问题是,如果您有一些未在属性设置器中实现的验证.
例如,假设我的整数属性必须是奇数.我没有在属性设置器中检查这个,所以我在验证事件中进行检查.
如您所见,根据上述行为,即使我取消验证,作为合法整数的值也将写入数据源.
尽管数据源已更新,但如果在验证事件中设置了"取消",则不会触发Validated事件,因此您仍然可以阻止用户继续进行.
变通::
要停止数据源更新,您需要在Binding.Parse事件中进行验证,并抛出异常 - 这会阻止Binding成功完成.
根据我的问题,如果我替换图片框中的图像,我应该首先处理原始图像吗?
或者,这种情况怎么样:
Dim bm As New Bitmap(32,32)
bm = New Bitmap(32,32)
bm = New Bitmap(32,32)
bm = New Bitmap(32,32)
Run Code Online (Sandbox Code Playgroud)
是否bm只需要在最后处置,还是应该在每次重新创建之前处置?
谢谢大家的答案.在我身上有一个很大的疏忽.我知道一个控制部门负责处理它的孩子,但我没有想到如果我更换它,我应该处理一个旧图像.
我有一个可变类,我用它作为通用字典的关键.只有当它们的引用相等时,两个键才应该相等.根据我的阅读,在这种情况下,我不需要重写Equals,GetHashCode或实现IEqualityComparer.
它是否正确?
我想使用mshtml.dll 9.0版的一些新功能,如IHTMLCSSRule.
以下文件夹中的互操作版本是版本7.0.3300.1:
C:\ Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll
以下文件夹中的COM版本是版本9.0.8112.16441:
C:\ WINDOWS\SYSTEM32\Mshtml.dll中
从我可以从网上确定,我应该这样做来创建一个.NET互操作版本9:
d:\ zTemp> tlbimp mshtml.tlb /out:Microsoft.mshtml.dll/namespace:mshtml/asmversi on:9.0
这似乎有效,但产生了以下警告:
TlbImp:警告TI3001:主互操作程序集'Microsoft.mshtml,Version = 7.0.3300.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'已经注册了类型库'C:\ Windows\system32\mshtml.tlb'.TLBIMP
:警告TI3016:类型库导入程序无法转换成员'mshtml._userBITMAP.pBuffer'的签名.TlbImp:
警告TI3016:类型库导入程序无法转换成员'mshtml._FLAGGED_BYTE_BLOB.abData'的签名.TlbImp:
警告TI3015:运行时封送程序无法对"mshtml.ICanvasPixel ArrayData.GetBufferPointer"中的至少一个参数进行封送处理.因此,这些参数将作为指针传递,并且可能需要不安全的代码来进行操作.TlbImp:导入到d:\ zTemp\Microsoft.mshtml.dll的类型库
'Microsoft.mshtml.dll'或其依赖项之一需要.Net Framework的更高版本而不是项目中指定的版本...
既然这是一个警告,让我以任何方式添加引用,我仍然可以使用.NET 3.5中的.dll的某些功能吗?
谢谢
正如标题所说,我正在寻找一个事件,以便在显示用户控件后捕获.
目前,我必须设置do-once变量并捕获Invalidated事件.
我认为差异已经在我的脑海中点击,但我想确定.
他说,在道格拉斯克罗克福德页面上的JavaScript Prototypal Inheritance中
在原型系统中,对象从对象继承.但是,JavaScript缺少执行该操作的运算符.相反,它有一个新的运算符,这样new f()就会产生一个从f.prototype继承的新对象.
我真的不明白他在那句话中想说的是什么,所以我进行了一些测试.在我看来,关键的区别在于,如果我在纯原型系统中基于另一个对象创建一个对象,那么所有父父成员应该在新对象的原型上,而不是在新对象本身上.
这是测试:
var Person = function(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.toString = function(){return this.name + ', ' + this.age};
// The old way...
var jim = new Person("Jim",13);
for (n in jim) {
if (jim.hasOwnProperty(n)) {
console.log(n);
}
}
// This will output 'name' and 'age'.
// The pure way...
var tim = Object.create(new Person("Tim",14));
for (n in tim) {
if (tim.hasOwnProperty(n)) {
console.log(n);
}
}
// This …Run Code Online (Sandbox Code Playgroud) (1)我已经阅读了很多关于IDisposable的问题,其中答案建议不要使用Finalize,除非你真的需要因为涉及的处理时间.
我没有看到的是这笔费用是多少以及支付的频率.每毫秒?第二?小时,天等
(2)此外,在我看来,如果一个物体可以处理,并不总是知道Finalize是否方便.例如,框架字体类.控件无法处理它,因为它不知道字体是否共享.字体通常是在设计时创建的,因此用户不会知道处理它,因此最终确定踢,以便在没有引用时最终摆脱它.这是一个正确的印象吗?
我想以一种精确复制CSS线性渐变行为的方式指定SVG线性渐变.例如,在CSS渐变中,您可以指定渐变开始和结束分别位于框的左上角和右下角.当框调整大小时,背景渐变会自动适应新大小.
在我的第一次尝试中,我通过指定角度并通过计算框大小的x1,y1,x2,y2坐标来复制带SVG的CSS线性渐变.但是如果调整框的大小,渐变的角度不会改变,也不再正确.(我必须重新计算所有坐标).
我的下一次尝试是使用变换来旋转渐变.这是一些代码:
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
<linearGradient id="g1" gradientUnits="userSpaceOnUse"
gradientTransform="rotate(-45 150 50)">
<stop stop-color="#FF0000" offset="0"/>
<stop stop-color="#00FF00" offset="0.5"/>
<stop stop-color="#0000FF" offset="1"/>
</linearGradient>
<rect x="0" y="0" width="100%" height="100%" fill="url(#g1)" />
</svg>
Run Code Online (Sandbox Code Playgroud)
现在,这适用于一个大小的盒子(300,100),但你会发现我必须指定旋转中心的绝对值(150,50).
我可以用百分比来指定中心吗?最后,我希望渐变的角度适应盒子的尺寸.
.net ×8
vb.net ×6
winforms ×4
c# ×3
idisposable ×3
data-binding ×2
css ×1
css3 ×1
dictionary ×1
events ×1
finalize ×1
gradient ×1
inheritance ×1
javascript ×1
mshtml ×1
prototype ×1
svg ×1
validation ×1