首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

初学vb.net开发 尝试开发一个进销存软件 有很多方法不熟悉 求指正和帮助 (连载1 登录窗口),该如何解决

2012-03-20 
初学vb.net开发 尝试开发一个进销存软件 有很多方法不熟悉 求指正和帮助 (连载1 登录窗口)因为初次尝试转

初学vb.net开发 尝试开发一个进销存软件 有很多方法不熟悉 求指正和帮助 (连载1 登录窗口)
因为初次尝试转用vb.net编程 对很多方法非常生疏 比方说数据库 我看了半天书只看懂了用dataTable 使用起来和以前完全是两种感觉 有种很不顺手的感觉 所以又想到了csdn
我是真心来求学 如果我的提问方式有什么问题的话也请大家指出来 以便我改正

我还是详细的把我的代码贴出来 祈大家教我


首先我准备从登录窗口入手
我画了一个登录窗口 如下图


然后建数据库
表名 UserLog 用来保存登录的历史记录 结构如下


表名 管理员 结构如下


然后下面奉上Login.vb的代码

VB.NET code
Public Class Login    Private daLogin As OleDb.OleDbDataAdapter    Private cbLogin As OleDb.OleDbCommandBuilder    Private dtLogin As DataTable    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click        '点击退出按钮        Me.Close()    End Sub    Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click        '点击登录按钮        CheckLogin()    End Sub    Private Sub CheckLogin()        '核对账号和密码        Dim Found As Boolean        Dim i As Integer        Dim errMessage As String = "该账号不存在"        cboUser.Focus()        cboUser.SelectAll()        For i = 0 To dtAdmin.Rows.Count - 1            If dtAdmin.Rows(i)("用户名").ToString = cboUser.Text Then                If dtAdmin.Rows(i)("密码").ToString = txtPassword.Text Then                    Found = True                    AdminIndex = i                    Exit For                Else                    errMessage = "密码错误"                    txtPassword.Focus()                    txtPassword.SelectAll()                End If            End If        Next i        If Found Then '登录成功            AddUserLog(i) '添加登录历史记录            mdiMain.Show() '载入主界面            LoginOk = True            Me.Close()        Else            MessageBox.Show(errMessage, "错误提示")        End If    End Sub    Private Sub AddUserLog(ByVal Index As Integer)        '添加到登录记录        Dim loginIndex As Integer = cboUser.FindStringExact(cboUser.Text)        If loginIndex > -1 Then            dtLogin.Rows(loginIndex)("password") = dtAdmin.Rows(Index)("密码")            dtLogin.Rows(loginIndex)("lasttime") = Now            dtLogin.Rows(loginIndex)("savepass") = chkRemember.Checked            dtLogin.Rows(loginIndex)("autolog") = chkAutoLog.Checked        Else            Dim NR As DataRow = dtLogin.NewRow()            NR("UserName") = dtAdmin.Rows(Index)("用户名")            NR("PassWord") = dtAdmin.Rows(Index)("密码")            NR("LastTime") = Now            NR("SavePass") = chkRemember.Checked            NR("AutoLog") = chkAutoLog.Checked            dtLogin.Rows.Add(NR)        End If        daLogin.Update(dtLogin)    End Sub    Private Sub Login_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing        '窗体关闭        dtLogin.Dispose()        cbLogin.Dispose()        daLogin.Dispose()        If Not LoginOk Then '如果未登录            dtAdmin.Dispose()            cbAdmin.Dispose()            daAdmin.Dispose()            Conn.Dispose()        End If    End Sub    Private Sub Login_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load        OpenConn() '连接数据库        ListLastUsers() '列出最后登录的用户列表        If Not LoginOk Then LoadAdmin() '装入管理员数据        Conn.Close() '关闭数据库        If chkAutoLog.Checked And Not LoginOk Then CheckLogin() '如果自动登录则登录    End Sub    Private Sub ListLastUsers()        '列出最后一次登录的用户        Sql = "select * from UserLog order by LastTime desc"        daLogin = New OleDb.OleDbDataAdapter(Sql, Conn)        cbLogin = New OleDb.OleDbCommandBuilder(daLogin)        '========对Access数据库保留字的处理===========        cbLogin.QuotePrefix = "["        cbLogin.QuoteSuffix = "]"        '=====================================        dtLogin = New DataTable        daLogin.Fill(dtLogin)        If dtLogin.Rows.Count > 0 Then            For i = 0 To dtLogin.Rows.Count - 1                cboUser.Items.Add(dtLogin.Rows(i)("UserName"))            Next i            cboUser.SelectedIndex = 0        End If    End Sub    Private Sub cboUser_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboUser.SelectedIndexChanged        '当用户改变时 根据数据库改变控件状态        chkRemember.Checked = CBool(dtLogin.Rows(cboUser.SelectedIndex)("savepass"))        If chkRemember.Checked Then            chkAutoLog.Checked = CBool(dtLogin.Rows(cboUser.SelectedIndex)("autolog"))            txtPassword.Text = dtLogin.Rows(cboUser.SelectedIndex)("Password").ToString        End If    End Sub    Private Sub chkRemember_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkRemember.CheckedChanged        '如果选了记住密码才显示自动保存        If chkRemember.Checked Then            chkAutoLog.Enabled = True        Else            chkAutoLog.Enabled = False        End If    End Sub    Private Sub btnRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemove.Click        '点击移除当前登录记录        dtLogin.Rows(cboUser.SelectedIndex).Delete()        cboUser.Items.RemoveAt(cboUser.SelectedIndex)        btnRemove.Enabled = False        txtPassword.Text = ""        chkRemember.Checked = False        chkAutoLog.Checked = False        daLogin.Update(dtLogin)    End Sub    Private Sub cboUser_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboUser.TextChanged        '文字改变时调整相应控件        If cboUser.FindStringExact(cboUser.Text) > -1 Then            btnRemove.Enabled = True        Else            btnRemove.Enabled = False            txtPassword.Text = ""            chkRemember.Checked = False            chkAutoLog.Checked = False        End If    End SubEnd Class 



有一些变量或过程写在module里
VB.NET code
    Public LoginOk As Boolean '登录成功    Public AdminIndex As Integer '管理员索引    Public Conn As OleDbConnection    Public daAdmin As OleDbDataAdapter    Public cbAdmin As OleDbCommandBuilder    Public dtAdmin As DataTable    Public Sql As String    Public Sub OpenConn()        Conn = New OleDbConnection        Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\Data.mdb"        Conn.Open()    End Sub    Public Sub LoadAdmin()        Sql = "select * from 管理员"        daAdmin = New OleDbDataAdapter(Sql, Conn)        cbAdmin = New OleDbCommandBuilder(daAdmin)        dtAdmin = New DataTable        daAdmin.Fill(dtAdmin)        AddHandler daAdmin.RowUpdated, New OleDbRowUpdatedEventHandler(AddressOf OnRowUpdated)    End Sub    Private Sub OnRowUpdated(ByVal sender As Object, ByVal args As OleDbRowUpdatedEventArgs)        Dim newID As Integer = 0        Dim idCMD As OleDbCommand = New OleDbCommand("SELECT @@IDENTITY", Conn)        If args.StatementType = StatementType.Insert Then            newID = CInt(idCMD.ExecuteScalar())            args.Row("ID") = newID        End If    End Sub


我个人感觉 对登录这样简单的操作用dataTable感觉很不爽 但我真的不知道怎么去写 另外我用循环遍历dataTable取符合条件的记录感觉非常傻和没有效率 求一般应该怎么写比较好

[解决办法]

你该不会就这样 一个窗口 一个功能的 要别人贴代码吧!
[解决办法]
做这种东西不要愤青。做完了就封装控件调用,然后暂时不要去纠结它了。
[解决办法]
有本事“不爽这个不爽那个”的,那么下一个任务点时去另外设计一种机制。不要在以前的东西上纠扯“不刷这个不爽那个”。这是两种态度,一种是不断开发新的组件,一种是刚做了一个组件就以为自己高级了、再也不用开发新的组件的、就该负责批评以前的组建了。后者是很不好的,你的探索精神完全可以在下一个组件的设计中体现,而不用纠缠于非要重写已经开发出来、而且目前还在正常运行的组件。
[解决办法]
如果你用过VB6的RecordSet,你可以用用DataReader对象。
[解决办法]
探讨
以前都是用的那个 ado 到了ado.net完全不会用

以前都是什么 set rs=adodb.recordset 类似这样写的... 现在很不习惯的说.. 我自己再去找找资料吧

热点排行