--- title: Winform date: 2022-11-18 14:48:31 author: 文永达 top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/B951AE18-D431-417F-B3FE-A382403FF21B.jpeg --- # Winform ## Net Framework ### 控件属性 #### Name 表示控件名 ```c# this.button1.Name = "button1"; ``` #### Text 表示控件文本显示 ```c# this.button.Text = "button1"; ``` ### 控件事件 #### button按钮 ##### click #### comboBox ##### SelectedIndexChanged 问题:SelectedIndexChanged控件,初始加载的时候总会进去两次,SelectedValue 值总为System.Data.DataRowView。 原因:最后才发现自己是先绑定数据源,后设置控件ValueMember和DisplayMember属性。 解决办法:正确的做法是先设置这两个属性,后绑定数据源。 ##### 绑定数据源 ```c# DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(string)); dt.Columns.Add("NAME", typeof(string)); DataRow dr = dt.NewRow(); dr["ID"] = "1"; dr["NAME"] = "NAME1"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["ID"] = "2"; dr["NAME"] = "NAME2"; dt.Rows.Add(dr); this.comboBox1.DisplayMember = "NAME"; this.comboBox1.ValueMember= "ID"; this.comboBox1.DataSource = dt; ``` ### 控件文本显示国际化 #### 使用资源文件方式 在解决方案根目录新建`App_GlobalResources`文件夹 新建 `Resource.en-US.resx` 资源文件 放置英文文本 新建 `Resource.resx`资源文件 放置默认简体中文文本 根目录新建 `ResourceCulture.cs`类 ```c# using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Resources; using System.Text; using System.Threading; namespace WindowsFormsApp1 { public class ResourceCulture { // 设置需要的语言文本资源文件 public static void SetCurrentCulture(string name) { if (string.IsNullOrEmpty(name)) { name = "en-US"; } Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name); } // 获取资源文件中的文本 public static string GetString(string id) { string strCurLanguage = ""; try { ResourceManager rm = new ResourceManager("WindowsFormsApp1.App_GlobalResources.Resource", System.Reflection.Assembly.GetExecutingAssembly()); CultureInfo ci = Thread.CurrentThread.CurrentCulture; strCurLanguage = rm.GetString(id, ci); } catch { strCurLanguage = "No id" + id + ", please add."; } return strCurLanguage; } } } ``` 控件里调用 新建initRes()方法 ```c# private void initRes() { // 设置 窗体form 名称 this.Text = ResourceCulture.GetString("Form1_frmText"); // 设置 分组框 groupbox 名称 this.gbLanguageView.Text = ResourceCulture.GetString("gbLanguageView_frmText"); this.gbLanguageSelection.Text = ResourceCulture.GetString("gbLanguageSelection_frmText"); } ``` 可以在窗体初始化调用加载 ```c# private void Form1_Load(object sender, EventArgs e) { this.initRes(); } ``` 如果是一个切换语言的窗体 新建可以切换的控件,这里使用`RadioButton`,因为是中英文切换,所以需要建两个`RadioButton` 使用`click`事件 ```c# private void radioButton1_CheckedChanged(object sender, EventArgs e) { ResourceCulture.SetCurrentCulture("en-US"); this.SetResourceCulture(); } private void radioButton2_CheckedChanged(object sender, EventArgs e) { ResourceCulture.SetCurrentCulture("zh-CN"); this.SetResourceCulture(); } ``` ## Net Core ### 打开其他窗体的三种方式 #### Show 例如登入界面进入主页面,直接将主页面展示出来,两个窗体互不影响 ```c# public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); } } ``` #### Owner 例如text文件中的“替换”选项,打开界面后不关闭也是允许操作主页面的 ```c# public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Owner = this; form2.Show(); } } ``` #### ShowDialog 例如text文件中的“打开”选项,打开界面后不关闭是不允许操作主页面的 ### 让子窗体显示在父窗体之上 ```c# public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(this); // this代表父窗体也就是Form1 } } ``` ### TextBox #### 属性 ##### Multiline 控制编辑控件的文本是否能够跨越多行。 ##### ScrollBars 指示对于多行编辑控件,将为此控件显示哪些滚动条 ##### WordWrap 指示多行编辑控件是否自动换行