如何关闭父母表格和打开孩子?

时间:2013-05-23 03:50:45

标签: vb.net

在我刚刚隐藏父表单之前,嘿伙计们,但是现在当我尝试从父文件中读取它时它说它不能,因为它已经在一个进程中运行了。我遵循了一些教程,它说要转到项目属性,并在关闭所有表单后让应用程序停止运行。

但是现在因为我这样做了它说找不到目录可能是因为我正在从父表单中读取输入。无论如何这里是我的代码

Dim writeFile1 As StreamWriter = New StreamWriter(File.OpenWrite("C:\Users\Nick\Documents\Visual Studio 2010\Projects\LoginFixed\Accounts\" + frmLogin.txtUser.Text))

我该怎么做呢?

编辑:

    Private Sub btnHunter_Click(sender As System.Object, e As System.EventArgs) Handles btnHunter.Click
    selection = "Hunter"
    writeData.classSelection()
End Sub

这是我点击按钮时所拥有的。

这是classSelection子:

    Public Sub classSelection()
    If frmClass.selection = "Hunter" Then
        writeFile1.WriteLine(frmClass.selection)
    End If
    If frmClass.selection = "Gatherer" Then
        writeFile1.WriteLine(frmClass.selection)
    End If
    If frmClass.selection = "Farmer" Then
        writeFile1.WriteLine(frmClass.selection)
    End If
    writeFile1.Close()
End Sub

错误指向此行:

If frmClass.selection = "Hunter" Then

无法找到部分文件路径。

3 个答案:

答案 0 :(得分:0)

如果要以封闭的父表单读取输入文本框,则必须声明public var

在项目中创建一个新模块..并添加此

public sLogin as String

在隐藏或关闭frmLogin之前..添加此

sLogin =  txtUser.Text

因此,您可以使用

更改代码
Dim writeFile1 As StreamWriter = New StreamWriter(File.OpenWrite("C:\Users\Nick\Documents\Visual Studio 2010\Projects\LoginFixed\Accounts\" & sLogin))

答案 1 :(得分:0)

matzone给了你一个很好的提示。要确切地检查您的路径是什么,只需使用变量添加MessageBox:

Dim writePath1 As String
Dim writeFile1 As StreamWriter

writePath1 = "C:\Users\Nick\Documents\Visual Studio 2010\Projects\LoginFixed\Accounts\" & sLogin
If MessageBox.Show(writePath1, "Continue ?", MessageBoxButtons.YesNo) = DialogResult.Yes Then
    writeFile1 = New StreamWriter(File.OpenWrite(writePath1))
    ' ...
    writeFile1.Close() ' Very important ! Adrian pointed it out.
End If

^^如果它有效,你可以放弃对话测试或用一些测试代码替换它,如If File.Exists(...)

但是,我不明白你想要 关闭 父表格还是 隐藏 。这不一样 ! 关闭父表单将放弃对父表单成员的任何访问权限,包括 txtUser.Text

如果要关闭父窗体,ChildForm不应该是您要关闭的父窗口的子窗口,或者您必须隐藏父窗体:

frmLogin.Hide() ' Not frmLogin.Close()

如果关闭frmLogin,则无法访问frmLogin.txtUser,或使用matzone提供的sLogin。或者,您应该将frmLogin.txtUser.Text值传递给ChildForm的自定义属性。

Imports System.IO
Public Partial Class ChildForm1
    ' Inherits System.Windows.Form
    ' ...
    Private _txtUserFile As String

    Public WriteOnly Property TxtUserFile() As String
        Set(ByVal NewFileName As String)
            _txtUserFile = NewFileName
        End Set
    End Property

    Public Sub LoadFile()
        Dim writeFile1 As StreamWriter = New StreamWriter(File.OpenWrite("C:\Users\Nick\Documents\Visual Studio 2010\Projects\LoginFixed\Accounts\" & txtUserFile))
        ' ...
        writeFile1.Close()
    End sub
    ' ...
End Class

然后在父表单中使用它:

MyChildForm.TxtUserFile = Me.txtUser.Text
' Me.Close() ' This will definately KILL Form1 (the parent one)
Me.Hide() ' Always use Hide() until you'll terminate your Application
MyChildForm.Show()
MyChildForm.LoadFile()

^^但这也不是一个好的代码!你的问题仍然不清楚(至少对我而言) “仍然说它无法找到路径的一部分”,然后检查路径..

  • 文件确实存在吗?
  • 路径是否包含故障? (使用提供的MessageBox测试)
  • 您的帐户是否可以访问该目录? (Windows配置和帐户级别)

答案 2 :(得分:0)

好吧!

事实上,问题可能出在其他地方。

例如,我能够通过提供一个空字符串[“”]作为以下值来重现您的异常:

frmLogin.txtUser.Text ' = ""
' or 
sLogin ' = ""
' or
txtUserFile ' = ""

事实上,我得到“无法找到路径的一部分...... ”异常,因为StreamWriter无法读取/写入文件,因为我没有提供该文件的有效FileName。由于filename参数是一个空字符串“”,StreamWriter提供的路径只是代表目录而不是文件,并且引发了异常。

现在,您应该在构建StreamWriter的新实例之前检查是否有有效路径,以确保您实际指向文件?

Dim writeFile1 As StreamWriter
Dim MyEntirePath As String = "C:\Users\...\Accounts\" + frmLogin.txtUser.Text
MessageBox.Show(MyEntirePath) ' would be enough to be sure your path is correct

' Some test code here...
If everythingOK then ' create the StreamWriter...
    writeFile1 = New StreamWriter(MyEntirePath)
    ' ...
' ...

此外,创建您的streamwriter并将其用于代码的其他部分/方法并不是一个好主意。你不知道有一天,你会改变你的代码,忘记在

之间建立联系
Dim writeFile1 As StreamWriter = New StreamWriter(File.OpenWrite("C:\Users\Nick\Documents\Visual Studio 2010\Projects\LoginFixed\Accounts\" + frmLogin.txtUser.Text))

' plus
Private Sub btnHunter_Click(sender As System.Object, e As System.EventArgs)
    ...
End Sub

' plus
Public Sub classSelection()
    ...
    writeFile1.Close()
End Sub

^^太多“在这里和那里”......

如果你试图点击btnHunter两次,你显然也会得到一个例外。我不知道你的代码的目的是什么,它是如何工作的,它看起来像一个游戏..但我会使用File。存在(..)检查,之前创建文件,如果没有,则将其放入Try / Catch以检查我是否最终没有管理员权限来写入该目录。否则,创建一个允许用户将文件读/写到自定义文件夹的代码。 Andalso,你有:

Application.StartupPath

^^非常有用,如:

Dim MyFilePath As String = Application.StartupPath + "\Datas\MyText.txt"

经过两周的编码,我通常会忘记将“C:\ blabla ..”或“D:\ gnagna”放在哪里,或者哪些类实际使用那些绝对引用路径。自从我在另一台计算机上转移到Win7之后,我已经放弃了很久以前获取目录的方式,而且我使用这种方法开发的所有这些应用程序都注定了......