VB高手请进:请教两个关于UserControl的问题。

时间:2021-08-31 13:58:45
我自己向建立一个自定义的用户控件用于绑定数据库中的数据日期字段,

我在自定义的用户控件中放入了三个控件:
TextBox    Name:"TD"  用于绑定表中的日期字段。
CommandButton   Name:"Com"   用于弹出日历控件
MonthView      Name:"MV"     共用户从日历中选择一个日期,
                             并将选择的结果格式化以后传递给TD

其工作时的情形是:TextBox显示表中的日期,当用户点击CommandButton时
弹出一个日历选择框供用户从中选择一个日期,选择完毕后,将用户选择的日期放回给TextBox。

问题一:
将此控件放在Form上能正常工作。但是,如果将此控件放在容器里,比如Frame里面,问题就来了。
当日里弹出后只能看见容器内的部分,超出部分被容器剪裁掉了,用户无法看见。

弹出日历的代码如下:
Private Sub Com_Click()        '弹出日历
    MV.Top = TD.Top + TD.Height
    MV.Left = TD.Left
    
    UserControl.Height = TD.Top + TD.Height + MV.Top + MV.Height
    UserControl.Width = IIf(MV.Width > TD.Width + Com.Width, MV.Left + MV.Width, UWidth)
    
    If IsNull(TD.Text) Or (Trim(TD.Text) = "") Or (Not IsDate(TD.Text)) Then
        MV.Value = Date
    Else
        MV.Value = CDate(TD.Text)
    End If
    MV.Visible = True
    MV.SetFocus
End Sub

请问各位高手:如何才能使Usercontrol像VB自带的控件(比如ListView等)一样,突破容器的限制呢?


问题二:

在自建的UserControl里为什么不能设置自己定义的属性值?
还是以上控件,我自定义了一个控件的属性UBorderSlty:

Public Property Get UBorderSlty() As 
    UBorderSlty = TD.BorderStyle
End Property

Public Property Let UBorderSlty(ByVal New_UBorderSlty As Integer)
    TD.BorderStyle = New_UBorderSlty
    PropertyChanged "UBorderSlty"
End Property

UBorderSlty属性的默认值为“0”

以上代码是VB自动生成的,但是在向Form添加了自定义控件后,设置UBorderSlty属性值为“1”的时候没有问题,
该Usercontrol立刻被加了边框,但在运行时,TD.BorderStyle的值却始终是自定义控件在设计时设定的值。
不知这是怎么回事?

6 个解决方案

#1


up

#2


为什么这样做?用DTPicker不好吗,非得自己做.

#3


我也定义和你类似的控件,如果兴趣,给我email,给你一具类似的程序
bingcaicai@sina.com

#4


我觉得最好不要包装现有的控件,太慢了,应该自己写一个类模块
然后添加一些属性和方法,将需要调整的控件定义成一个属性
然后再类模块内部
private withevents M_Text as Textbox
Private WithEvents M_Cmd as CommandButton
Private WithEvents M_Dtpicker as Dtpicker
然后你就可以看到代码窗体左边下拉框中出现了刚定义的三个控件,
选中可以在右边的相应事件中添加代码。

#5


chenhw(我要回复):
我这样做的最主要的原因是DTPicker控件自默认模式下不能接收NULL值,所以在绑定到某个字段时如果该字段允许NULL值的话就会出错。

#6


sssoft(恒谦):
你的方法我也很感兴趣,我试试看。

#1


up

#2


为什么这样做?用DTPicker不好吗,非得自己做.

#3


我也定义和你类似的控件,如果兴趣,给我email,给你一具类似的程序
bingcaicai@sina.com

#4


我觉得最好不要包装现有的控件,太慢了,应该自己写一个类模块
然后添加一些属性和方法,将需要调整的控件定义成一个属性
然后再类模块内部
private withevents M_Text as Textbox
Private WithEvents M_Cmd as CommandButton
Private WithEvents M_Dtpicker as Dtpicker
然后你就可以看到代码窗体左边下拉框中出现了刚定义的三个控件,
选中可以在右边的相应事件中添加代码。

#5


chenhw(我要回复):
我这样做的最主要的原因是DTPicker控件自默认模式下不能接收NULL值,所以在绑定到某个字段时如果该字段允许NULL值的话就会出错。

#6


sssoft(恒谦):
你的方法我也很感兴趣,我试试看。