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

本文关键字:设计模式 编辑 消失 代码 vb 文件 自定义 | 更新日期: 2023-09-27 18:30:57

我在 vb.net 中有一个名为"form1"的表单。此窗体具有许多控件。我打开了form1.designer.vb文件并输入了一个ifelse表达式,例如:

如果 getLanguage() = "en" 则 label1.text = "早安" 否则 label1。文本 = "Bonjour"

这在运行时工作得很好。

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

有没有办法保留我放在设计器页面中的任何代码?我不想将它们放在 form1.vb 文件的加载事件中。

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

找到此代码:

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

然后添加一行:

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

然后在 form1 中创建该方法.vb或您创建的另一个分部类副本:

    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开头。
  • 然后编辑每个控件文本:在按钮中写"你好",在标签中写"
  • 早上好",在菜单项中写"因为我很开心"等。
  • 然后再次更改语言,选择"French"。
  • 然后再次编辑每个控件并写下"Bonjour","Je vous souhaite un bon matin","Parceque je suis de bonne humeur"....是的,你已经失去了以前的文本,但有信心
  • 编译项目而不启动它,您将看到 IDE 创建了两个新文件Form1.en.resxForm1.fr.resx(左右)以及 Form1.vbForm1.Designer.vb 。不要编辑它们!

如果您打开 en.resx 或 fr.resx,您将看到您所做的编辑就在那里。这些文件用于存储表单的内置 Lang 相关资源。这就是所谓的全球化。

然后再次找到窗体的构造函数。

    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

不要忘记在类声明之上添加这两个命名空间:

Imports System.Globalization
Imports System.Threading

瞧!我知道我说过你不必费心编写代码,但是构造函数中的上述位足以处理语言的选择。Plus besoin de taper du code superflu après ça.

对于您的示例,也许更好的是使用表单的属性

.Localizable = true
.Language = Default(French)/English/or others

Visual Studio创建一个类的两个文件(这是你的表单) - 分部类
因此,在哪个文件中编写代码并不重要。
只有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

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