一个继承类的问题

wanbolantian 2008-05-20 06:01:46
我在Vb.net添加了一个用户控件,该控件继承自Combobox控件,我想实现在控件运行的时候,自动
根据设置好的SQL语句将数据提取到前台,并添回到Combobx中,代码如下:

Public Class Combox
Private _Connection As SqlClient.SqlConnection

'保存连接对像的属性
Property Connection() As SqlClient.SqlConnection
Get
Return _Connection
End Get
Set(ByVal value As SqlClient.SqlConnection)
_Connection = value
End Set
End Property

Private _SqlString As String = ""
'保存要查询的SQL语句
Property SqlString() As String
Get
Return _SqlString
End Get
Set(ByVal value As String)
_SqlString = value
End Set
End Property

Private _Type As Boolean = True
'定义控件何时应该进行Fill,Ture表示在控件初始化进填充数据,Flase表示在点击控件的下拉箭头时才填充
Property Type() As Boolean
Get
Return _Type
End Get
Set(ByVal value As Boolean)
_Type = value
End Set
End Property

Private Sub FillData() '填充数据到控件中
If Me.SqlString <> "" Then
If TypeOf Me.Connection Is SqlClient.SqlConnection Then

If Me.Connection.State = ConnectionState.Closed Then
Try
Me.Connection.Open()
Catch Ex As SqlClient.SqlException

MessageBox.Show(Ex.Message)
End Try
End If

Me.Items.Clear()

Dim DataReader As SqlClient.SqlDataReader
Dim Command As New SqlClient.SqlCommand(Me.SqlString, Me.Connection)


DataReader = Command.ExecuteReader()

Me.BeginUpdate()

While DataReader.Read()

Me.Items.Add(DataReader.Item(0))
End While

Me.EndUpdate()

DataReader.Close()
Me.Connection.Close()
Else
MessageBox.Show("没有为属性Connection赋于正确的Connection对像", "参数错误", MessageBoxButtons.OK)
End If
Else
MessageBox.Show("还没有填写要获取数据的SQL语句!", "参数错误", MessageBoxButtons.OK)
End If

End Sub

Private Sub 继承Combox_DropDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.DropDown

If Me.Type = False Then
Me.FillData()
End If

End Sub

Public Sub New()

' 此调用是 Windows 窗体设计器所必需的。
InitializeComponent()

' 在 InitializeComponent() 调用之后添加任何初始化。

If Me.Type = True Then
Me.FillData()
End If


End Sub
End Class

新建好控件后,我再将控件放到一个Form上,但是运行Form的时候,就会出现"还没有填写要获取数据的SQL语句!",而且是出现两个错误提示,而我的SqlString属性中已经写上了获取数据的SQL语句了,而且,就算是没填SQL语句,也应该是只出现一次错误提示,为什么会出现两次呢?
...全文
84 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanbolantian 2008-05-24
  • 打赏
  • 举报
回复
还是没有结果,真晕……
yanlongwuhui 2008-05-22
  • 打赏
  • 举报
回复
你没有在#Region " Windows 窗体设计器生成的代码 "这里面的代码中设置端点进行跟踪吧?应该能跟踪到2次的
yanlongwuhui 2008-05-21
  • 打赏
  • 举报
回复
你可以把代码移到HandleCreated事件中试下
zhykhld 2008-05-21
  • 打赏
  • 举报
回复
VB.Net的初始化很普通,但控件的初始化就不普通了,本人也建议不在控件中写这种逻辑,特别是需要与数据库交换数据时
yanlongwuhui 2008-05-21
  • 打赏
  • 举报
回复
你程序中的某些代码触发了你的用户控件的一些事件,你可以单步跟踪下。
你的是继承的用户控件,没有LOAD的
wanbolantian 2008-05-21
  • 打赏
  • 举报
回复
谢谢yanlongwuhui的提点,把
If Me.Type = True Then
Me.FillData()
End If

代码注释掉的话,确实是不会发生
错误了,但也达不到我想在控件初
始化时填充数据的目的了。

我现在觉得想不通的就是,
我在控件的SqlString中填入了要
获取数据的SQl语句,为什么在运行
时还会出现没有填写SQL语句的提示,
而且还是会出现两次?vb.net的初始
化真是奇怪……

另外,用户控件中有Load事件吗?我
怎么没找到?
yanlongwuhui 2008-05-21
  • 打赏
  • 举报
回复
代码移到用户控件的load事件中试下
yanlongwuhui 2008-05-21
  • 打赏
  • 举报
回复
应该是这段代码的原因吧:
If Me.Type = True Then
Me.FillData()
End If
注释掉试下
wanbolantian 2008-05-21
  • 打赏
  • 举报
回复
我知道UI应该和数据层分开,现在我想知道的是在控件运行时
,也就是调用到Sub new 事件里代码的时候,为什么会出现
两次提示"还没有填写要获取数据的SQL语句!"?但是我的
SqlString属性里确实已经填上要获取数据的SQL语句了呀?
而且就算是没有填写SQL语句,应该也只是出现一次错误提示
才对,为什么会有两次提示呢?难道控件的Sub New 事件
被调用两次么?
wanbolantian 2008-05-21
  • 打赏
  • 举报
回复
出现错误的原因找到了,原来Combox控件的New是在Form的New事件之前发生,
那么在Combox初始化的时候,由于SqlString属性为空(其实赋值的过程是
VB自动在Form的New中填写,也就是说,虽然我在控件的SqlString属性中填
写了SQl语句,也是要到Form的New事件 才会发生实际的赋值,而由于Combox在Form之前创建,属性默认是空的)
,所以引发了之前设定好的错误 提示

但还是有一点想不明白,为什么会出现两次错误提示呢?我用单步调试的时候
,却又只出现一次错误提示了?正常运行时就会出现两次??我快崩溃了……
jinjazz 2008-05-20
  • 打赏
  • 举报
回复
这种逻辑不适合封装,ui和数据层应该分离。
changjiangzhibin 2008-05-20
  • 打赏
  • 举报
回复
没细看,在用户控件的后台代码中实现根据特定参数,加上元素,
如:public MyUserControl(string connectionString,string sql)
即提供一个连库字串和一个查询SQL语句

16,717

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧