在designer.vb文件自定义代码消失使得在设计模式编辑时,(Custom code in de

2019-10-21 07:19发布

我有一个在vb.net名为“Form1的”形式。 这种形式有很多控制。 我打开Form1.Designer.vb文件,并放在一个的if else表达式,比如:

如果使用getLanguage()= “EN”,然后label1.text = “早安” 否则label1.Text = “卓悦”

这在运行时的工作完全正常。

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

有没有一种方法,我可以让我把在设计网页的任何代码? 我不想把他们在加载事件在Form1.vb文件。

Answer 1:

找到这样的代码:

    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)


而在其他的答案说,更好地利用.Localizable属性在IDE中,它改变从FalseTrue 。 然后,你将可以获得几个默认语言。 你不必费心编写代码。

  • 选择一种语言入手: English的例子。
  • 然后编辑控件文本中的每一个:在标签的按钮,“早上好”写“你好”,“因为我快乐”的菜单项等。
  • 然后再次更改语言,选择French
  • 然后再编辑每个控制并写上“卓悦”,“JE VOUS souhaite联合国盂兰盆晨报”,“Parceque猪乙脑德保姆humeur” ...... 你失去了以前的文本,但有信心
  • 编译项目,而无需启动它,你会看到IDE创建两个新文件Form1.en.resxForm1.fr.resx沿(左右) Form1.vbForm1.Designer.vb 。 不要对其进行编辑!

如果你打开en.resx或fr.resx,你会看到你所做的编辑都在那里 。 这些文件是用来存储内置郎相关ressources为表单。 那是断然称为全球化。

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

    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

瞧! 我知道我说你不必费心编写代码,但上面构造函数的位足以处理语言的选择。 另外besoin德锥杜代码superflu滑雪后的CA。



Answer 2:

对于你的榜样,也许更好的将使用形式的财产

.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


Answer 3:

designer.vb文件是由Visual Studio自动创建。 每次编辑表单的设计时,该文件被重新写入。 现在,你为什么不想对加载代码? 负载事件或构造函数(如前所述)是在正确的地方,把你需要的任何初始化。



文章来源: Custom code in designer.vb file goes away when making edits in design mode