2013-06-11 18 views
2

这让我疯狂。我从菜单屏幕上的button_click调用表单。在Form2的form_load中途,它将从菜单屏幕重新调用button_click,而不是完成form_load。它总是发生在第二个组合框的execute_reader上。代码跳回到以前的表单

我试过注释掉第二个组合框的代码块,并且form_load完成了,但是如果我再关闭该窗体并再次单击菜单屏幕上的按钮,它会重新调用相同的button_click, adapter.Fill(表)。从frmMenu

Private Sub btnManageEquipment_Click(sender As Object, e As EventArgs) Handles_ btnManageEquipment.Click 
    frmManageEquipment2.Show() 
    Me.Hide() 
End Sub 

代码

代码从frmManageEquipment2_Load

Private Sub frmManageEquipment2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    strString = "Select * from equipment" 
    adapter = New MySqlDataAdapter(strString, conn) 
    Dim commandBuilder As New MySqlCommandBuilder(adapter) 
    table.Locale = System.Globalization.CultureInfo.InvariantCulture 
    adapter.Fill(table) 
    bindEquipment.DataSource = table 
    navEquipment.BindingSource = bindEquipment 


    Me.txtEqName.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_Name", True)) 
    Me.cboArea.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_area", True)) 
    Me.cboEqSubarea.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_subarea", True)) 
    'Me.cboEqType.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_type", True)) 
    'Me.txtMarca.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_marca", True)) 
    'Me.txtModel.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_model", True)) 
    'Me.txtCapacity.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_capacity", True)) 
    'Me.txtSerieEquipe.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_SerieEquipe", True)) 
    'Me.txtSerieMotor.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_SerieMotor", True)) 
    'Me.txtEngineMarca.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_EngineMarka", True)) 
    'Me.txtEngineModel.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_EngineModel", True)) 
    'Me.txtAirFilter.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_AirFilter", True)) 
    'Me.txtTorqueConversion.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_TorqueConversion", True)) 
    'Me.txtTransmission.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_Transmission", True)) 
    'Me.txtAxle.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_Axle", True)) 
    'Me.txtBrakes.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_Brakes", True)) 
    'Me.txtStarterElecSystem.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_StarterElectSystem", True)) 
    'Me.txtTireSize.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_TireSize", True)) 
    'Me.txtFireSupprSystem.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_FireSupprSystem", True)) 
    'Me.txtCost.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_cost", True)) 
    'Me.txtPurchaseDate.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_PurchaseDate", True)) 
    'Me.txtLifeExpectance.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_LifeExpectancy", True)) 
    'Me.txtSellPrice.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_SellPrice", True)) 
    'Me.dtpSellDate.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_SellDate", True)) 
    ''Me.txtEqID.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_ID", True)) 
    'Me.txtEqID.DataBindings.Add(New Binding("Text", Me.bindEquipment, "Eq_ID", True)) 

    cboArea.AutoCompleteMode = AutoCompleteMode.Append 
    strSQLArea = "Select distinct(eq_Area) from Equipment order by eq_Area" 
    sqlCommand = New MySqlCommand(strSQLArea, conn) 
    Dim readerArea As MySqlDataReader = sqlCommand.ExecuteReader() 
    While readerArea.Read() 
     cboArea.Items.Add(readerArea.GetString(0)) 
    End While 
    cboArea.AutoCompleteMode = AutoCompleteMode.Append 
    cboArea.AutoCompleteSource = AutoCompleteSource.ListItems 


    cboEqSubarea.AutoCompleteMode = AutoCompleteMode.Append 
    strSQLSubArea = "Select distinct(eq_SubArea) from Equipment order by eq_SubArea" 
    sqlCommand = New MySqlCommand(strSQLSubArea, conn) 
    Dim readerSubArea As MySqlDataReader = sqlCommand.ExecuteReader() 
'*****This is where it kicks back to the button click from the menu screen******* 
    While readerSubArea.Read() 
     cboEqSubarea.Items.Add(readerSubArea.GetString(0)) 
    End While 
    cboEqSubarea.AutoCompleteMode = AutoCompleteMode.Append 
    cboEqSubarea.AutoCompleteSource = AutoCompleteSource.ListItems 

End Sub 

* * *我却改变了我如何处理这个完全我仍然有同样的问题。现在我正在使用数据适配器,并在我们的属性字段中绑定我的文本框。我真的想使用自动完成功能

Private Sub frmManageEquipment2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    'TODO: This line of code loads data into the 'AssetmgtDataSet.equipment' table. You can move, or remove it, as needed. 
    Me.EquipmentTableAdapter.Fill(Me.AssetmgtDataSet.equipment) 



    strSQL = "Select distinct(eq_Area) from Equipment order by eq_Area" 
    txtArea.AutoCompleteMode = AutoCompleteMode.SuggestAppend 
    txtArea.AutoCompleteSource = AutoCompleteSource.CustomSource 
    sqlCommand = New MySqlCommand(strSQL, conn) 
    Dim readerArea As MySqlDataReader = sqlCommand.ExecuteReader 
    Dim sStringCollArea As New AutoCompleteStringCollection 
    While readerArea.Read() 
     sStringCollArea.AddRange(New String() {readerArea(0)}) 
    End While 
    readerArea.Close() 
    txtArea.AutoCompleteCustomSource = sStringCollArea 


    strSQL = "Select distinct(eq_SubArea) from Equipment order by eq_SubArea" 
    txtSubarea.AutoCompleteMode = AutoCompleteMode.SuggestAppend 
    txtSubarea.AutoCompleteSource = AutoCompleteSource.CustomSource 
    sqlCommand = New MySqlCommand(strSQL, conn) 
    Dim readerSubArea As MySqlDataReader = sqlCommand.ExecuteReader 
    Dim sStringCollSubArea As New AutoCompleteStringCollection 
    While readerSubArea.Read() 
****'This is where it goes back to the menu screen now**** 
     sStringCollSubArea.AddRange(New String() {readerSubArea(0)}) 
    End While 
    readerSubArea.Close() 
    txtSubarea.AutoCompleteCustomSource = sStringCollSubArea 

End Sub 
+2

没有简单的解释写在所示事件的编码不是。除此之外,很明显需要一段时间才能看到该表单。用户会不耐烦,反复敲击按钮。这些点击收集在输入队列中,并稍后执行。创建一个响应式用户界面以避免这种失败模式,BackgroundWorker是规范的方法。通过解释什么是“反击”可能意味着什么以及如何知道它是行为不端行为来获得更好的答案。 –

+0

堆栈损坏? – Neolisk

+0

您应该至少在打开readerSubArea之前调用readerArea.Close(),它可能在试图在同一命令上打开新数据读取器时崩溃。 – Johnfed

回答

1

把所有的SQL东西放在一个单独的线程。然后从form_load开始线程。这应该可以解决这个问题。在UI线程上加重计算/ DBMS代码等并不是一个好的编程习惯。它会在用户界面和计算方面造成问题。

0

不叫直接创建它的实例第一

Dim nWindow As New frmManageEquipment2() 
nWindow.Show() 

在Load事件