在设计模式下进行编辑时,designer.vb文件中的自定义代码会消失

时间:2014-11-18 18:18:37

标签: c# vb.net winforms controls designer

我在vb.net中有一个名为“form1”的表单。此表单有许多控件。我打开了form1.designer.vb文件并输入了if else表达式,例如:

如果getLanguage()=“en”那么label1.text =“早安”Else label1.Text =“Bonjour”

这在运行时完全正常。

如果我在设计中打开Form1.vb [Design]页面并进行任何更改,则上面的代码会消失。

有没有办法可以保存我在设计器页面中放入的代码? 我不想将它们放在form1.vb文件中的load事件中。

3 个答案:

答案 0 :(得分:2)

对于您的示例,最好使用

形式的属性
.Localizable = true
.Language = Default(French)/English/or others

Visual Studio创建一个类的两个文件(这是您的表单) - Partial Class
因此,编写代码的文件无关紧要 只有visual studio使用designer.vb文件来生成设计者所做的表单更改

来自designer.vb的代码包含在构造函数中执行的方法InitializeComponent 创建自己的方法,并在构造函数中InitializeComponent之后立即调用它 如果您不想放入yourform.vb

,请为您的代码创建第三个文件

档案yourForm.MyDesigner.vb

'Using Keyword Partial not necessary anymore,  
'because it is used in the `yourForm.Designer.vb` 
Public Class yourForm

    Public Sub Changelabel()
        If getLanguage() = "en" Then 
            label1.text = "Good Morning" 
        Else 
            label1.Text = "Bonjour"
        End If
    End Sub

End Class

答案 1 :(得分:2)

找到此代码:

    Public Sub New()
        Me.InitializeComponent()
    End Sub

然后添加一行:

    Public Sub New()
        Me.InitializeComponent()
        Me.MakeComponentsChanges()
    End Sub

然后在form1.vb或您创建的另一个Partial Class副本中创建方法:

    Private Sub MakeComponentsChanges()
        If getLanguage() = "en" then
            label1.text = "Good Morning"
        Else
            label1.Text = "Bonjour"
        End If
    End Sub

请勿触摸form1.designer.vb(.cs)


如其他答案所述,最好在IDE中使用.Localizable属性,并将其从False更改为True。然后您将获得几种默认语言的访问权限。你不必费心去编写代码。

  • 选择一种语言作为开头:例如English
  • 然后编辑每个控件文本:在一个按钮中写“Hello”,在标签中写“早安”,在MenuItem中写“因为我很开心”等。
  • 然后再次更改语言,选择French
  • 然后再次编辑每个控件并写上“Bonjour”,“Je vous souhaite un bon matin”,“Parceque je suis de bonne humeur”.... YES 你丢失了之前的文字但有信心
  • 编译您的项目而不启动它,您将看到IDE已创建两个新文件Form1.en.resxForm1.fr.resx(或左右)以及{{1 }和Form1.vb。不要编辑它们!

如果您打开en.resx或fr.resx,您会看到您所做的修改在那里。这些文件用于存储与您的表单内置的Lang相关的资源。这被称为全球化。

然后再次找到表单的构造函数。

Form1.Designer.vb

不要忘记在Class声明的顶部添加这两个名称空间:

    Public Sub New()
        Me.InitializeComponent()
        'Me.MakeComponentsChanges()
        ' Now you know about some Globalization, 
        ' you may get rid of that Method.

        ' Add two variables :
        Dim OriginalCulture As CultureInfo
        Dim CurrentOSCulture As CultureInfo

        ' Initialize them
        OriginalCulture = Thread.CurrentThread.CurrentCulture
        CurrentOSCulture = CultureInfo.CurrentCulture

        ' Do this test :
        Try
            Thread.CurrentThread.CurrentCulture = CurrentOSCulture ' may fail
            Thread.CurrentThread.CurrentUICulture = CurrentOSCulture ' may fail
            ' Attempt to match the current Thread culture to the Operating System one.
        Catch CurrentException As Exception
            Thread.CurrentThread.CurrentCulture = OriginalCulture
            Thread.CurrentThread.CurrentUICulture = OriginalCulture
            ' If it fails, revert back to default as defined in your IDE
        End Try
    End Sub

瞧!我知道我说你不必费心去编写代码,但构造函数中的上述部分足以处理语言的选择。 Plus besoin de taper du codesuperfluprèsça。

答案 2 :(得分:1)

designer.vb文件由Visual Studio自动创建。每次编辑表单的设计时,都会重写该文件。 现在,为什么你不想在Load上拥有该代码? load事件或构造函数(如前所述)是放置所需初始化的正确位置。