Winform高频面试题
大约 19 分钟约 5593 字
Winform高频面试题
1. 如何设置窗体页面的默认提交按钮?
设置Form的AcceptButton属性,将用户按Enter时,就相当于单击了AcceptButton属性指定的按钮,
就会引发它的Click事件。
2. 怎么让一个窗体在运行时,只能打开一个?
1)可以通过遍历Application的OpenedForms集合,从中如果找到了该Form,将其激活即可
2)给该Form定义静态创建方法,除非该页面已经关闭或释放,否则直接返回该实例,不重复创建
public static Form1 frm;
//静态构造方法
public static Form1 CreateInstance()
{
if (frm== null || frm.IsDisposed)
frm= new Form1();
return frm;
}
3. Form中有多个按钮,如何做到让它们都响应同一个单击事件处理 程序,显示它们各自的名称信息?
先定义一个实现该效果的事件处理程序:
Private void Btn_Click(object sender,EventArgs e)
{
Button btn=(Button)sender;
MessageBox.Show($”点击的按钮是:{btn.Text}”);
}
然后订阅按钮的单击事件,
如Btn1按钮的订阅:Btn1.Click+=Btn_Click;
Btn2按钮的订阅:Btn2.Click+=Btn_Click;
.....
Btnn按钮的订阅:Btnn.Click+=Btn_Click;
4. 如何让Form的尺寸在运行时不可调整?
1)首先将Form的FormBoderStyle属性设置为:FixedSingle/Fixed3D/FixedDialog/FixedToolWindow;
2)再将Form的MaximizeBox设置为False
然后,运行时,Form的大小就不可调整了。
5. 将Form2作为子窗体显示在Form1内,如何实现?
1) 将Form1的IsMdiContainer属性设置为True;
2)Form2 f2=new Form2();
f2.MdiParent=this;(这里的this指Form1,假设当前页就是Form1)
F2.Show();
6. Winform中,Form之间传值方式有哪些?
(1)通过Tag属性
(2)通过构造函数(在要接收值的Form页代码后台,定义一个带参数的构造函数)
(3)在接收值的Form代码后台文件中,定义一个public的变量
(4) 通过静态变量
(5)通过事件参数传值
7. Winform中,怎么实现Form2中点击打开按钮,打开Form1,输入文本,再点击Form1中的“确定”按钮,把输入的值显示到Form2的文本框中?
1) 首先自定义一个事件参数TextBoxArgs:
Public class TextBoxArgs:EventArgs
{
public string TxtValue{get;set}
Public TextBoxArgs(string val)
{
TextValue=val;
}
}
2) 在Form1后台声明一个事件:public event Action<object,TextBoxArgs> SetTextBoxValue;
3) Form2中:
在Form2的”打开”按钮的Click事件中:
Form1 f1=new Form1();
f1.SetTextBoxValue+=F1_SetTextBoxValue;
f1.Show();
private void F1_SetTextBoxValue(object sender,TextBoxArgs e)
{
txtValue.Text=e.TxtValue;
}
4) Form1中:
Form1的"确定"按钮的Click事件处理程序中:
string txtValue=txtInfo.Text.Trim();
TextBoxArgs arg=new TextBoxArgs(txtValue);
SetTextBoxValue?.Invoke(this,arg);
完成!
8. 在Winform应用程序中,Appplication.Exit 与 Form.Close有什 么不同?
Appplication.Exit()表示退出应用程序,Form.Close()表示关闭当前Form。
一般只有当Form是启动窗体时,它们才会有一样的效果,如果是非启动窗体,Form.Close()只是关闭
当前Form而已。
9. 在Winform中,我们发现在一个Form相关的cs文件有两个,它们的类名都是一样的,只是代码后台类文件中的class之前有partical修饰而已,这是为什么?
C# 2.0可以将类、结构、接口的定义拆分到两个或多个源文件中,用partial关键字修饰。这里也是这个 道理。
Form分为两个类文件,其实还是只一个类,一个文件名是xx.Designer.cs 表示Form的UI代码文件,其
中的代码是自动生成的,一般不建议去修改;另一个以.cs结尾的是后台文件文件,我们可在其中自己代
码。等到编译运行时,系统会自动将两部分合成一个类。
10. 如何在关闭窗体时,可以取消关闭?
在窗体的Form_Closing事件中,首先显示询问消息框,当用户点击“是”才执行关闭,当点击“否”,则取 消关闭,实现方式如下:
private void Form1_Closing(object sender,FormClosingEventArgs e)
{
If(MessageBox.Show(“您确定要关闭该页吗?”,”关闭提示”, MessageBoxButtons.YesNo,
MessageBoxIcon.Question)==DialogResult.No)
e.Cancel=true;
}
11. DataGridView中添加了一个ComboBox列,如何使用?
如果DataGridView是要绑定数据的话,首先设置这个列的DataPropertyName,如果该列对应的数据源 中的列是编号的话,就设置该编号列的列名或属性名;
然后在页面的Load事件中,在绑定DataGridView的数据源之前,先获取该列,指定该下拉框列的 DataSource.
绑定下拉框列的数据源:
DataGridViewComboBoxColumn colCbo = dgvList.Columns["colCboName"] as
DataGridViewComboBoxColumn;
colCbo .DataSource = GetCboList();
colCbo .DisplayMember = "ClassName";
colCbo .ValueMember = "ClassId";
再指定DataGridView的数据源:
DgvList.DataSource=list;
12. 在Form中,实现无边框窗体拖动功能?
首先:将Form的FormBorderStyle设置为None.
然后,在工具箱中拖一个Panel控件到Form中,并将Panel控件的Dock设置为:Top.
这时的Form因为没有边框,是不能拖动的,接下来,我们来实现拖动效果:
先注册Panel的MouseDown和MouseMove事件,
Point point = new Point();
bool isMove = false;//是否移动
private void pTop_MouseDown(object sender, MouseEventArgs e)
{
point = e.Location;//按住的点
isMove = true;
}
private void pTop_MouseMove(object sender, MouseEventArgs e)
{
Point pointNew;
if (e.Button == MouseButtons.Left && isMove)
{
pointNew = e.Location;//按住的点拖动到的位置
Point fPointNew = new Point(pointNew.X - point.X, pointNew.Y - point.Y);//相对于原来起点的距 离点的描述
this.Location += new Size(fPointNew);
}
}
13. 实现一个能动态添加多层次结构的TreeView节点的递归方法(以菜单数据为例)
private void AddTreeNodes(List<MenuInfo> mList, TreeNode pNode, int pId)
{
var subList = mList.Where(m => m.ParentId == pId);
foreach(var child in subList)
{
TreeNode node= new TreeNode ();
node.Name = child.MenuId.ToString();
node.Text = child.MenuName;
//添加到谁下边
if (pNode!= null)
pNode.Nodes.Add(node);
else
tvList.Nodes.Add(node);
AddTreeNodes(mList, node, child.MenuId);
}
}
调用时:AddTreeNodes(allMenus,null,0);即可
14. Form中的控件与数据可以实现双向绑定吗?
使用控件的DataBandings集合可以实现数据绑定,为Form定义一个实体模型,将控件的属性与实体模
型中的属性绑定在一起,当页面控件的属性值改变时,模型中的属性值自动更新,不需要一一再去获
取;当模型中的属性值修改时,控件的属性值也会自动更新。
模型基类,实现INotifyPropertyChanged接口,可以通知客户端属性性已更改
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName="")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
页面的模型:
Public class UserInfo:ViewModelBase
{
string userName;
public string UserName
{
get{return userName; }
set
{
userName= value;
OnPropertyChanged();
}
}
int age;
public int Age
{
get{return age; }
set
{
age= value;
OnPropertyChanged();
}
}
}
Form页面 控件绑定:
Form1_Load事件处理程序:
UserInfo userInfo=null;
private void Form1_Load(object sender, EventArgs e)
{
userInfo=new UserInfo ();
txtUserName.DataBindings.Add("Text", userInfo, "UserName");
txtUserAge.DataBindings.Add("Text", userInfo, "Age");
}
15. ComboBox控件绑定枚举类型如何实现?
比如定义一个星期的枚举类型
public enum Weekdays
{
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
//定义WeekDayInfo实体类
public class WeekDayInfo
{
public int DayValue{get;set;}
public string DayName{get;set;}
}
//将枚举类型中的值转换成List
public List GetWeekDayList()
{
List list=new List();
foreach(int wdVal in Enum.GetValues(typeof(Weekdays)))
{
WeekDayInfo wd=new WeekDayInfo();
wd.DayValue=wdVal;
wd.DayName=Enum.GetName(typeof(Weekdays),wdVal);
list.Add(wd);
}
return list;
}
然后在Form1的Load事件中绑定数据源:
comboBox1.DisplayMember = "DayName";
comboBox1.ValueMember = "DayValue";
comboBox1.DataSource = GetWeekDayList();
16. Form窗体的Load事件什么时候引发?
当调用Form的Show()方法或ShowDialog()方法时,就会引发Load事件。
17. Windows.Forms.Timer 计时器如何实现动态时间
这个计时器是基于UI的,可以修改控件的。首先,直接在Form上拖控件Timer,设置Enabled=true(程序
运行计时器立即运行);然后设置时间间隔:Interval 为 1000(ms),表示每隔1s执行一次。
最后,注册每隔Interval设置的时间间隔执行的Tick事件即可。
private void timer1_Tick(object sender, EventArgs e)
{
this.label1.Text = DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);
}
18. Winform中,控件开发分为哪些?
在Winform中,自定义控件可分为三种:
1)复合控件:将现有标准控件组合起来成一个新控件
如public class UserCardControl:UserControl{ }
2)扩展控件:继承于现有控件,扩展新的特性或重绘外观
如:public class ButtonEx:Button { }
3)自定义控件:完全地自定义一个控件。该控件继承于Control,重写OnPaint()实现控件外观绘制。
Public class NewControl:Control
{ }
19. 如何实现C#代码添加控件到Form窗体上?
这里以Label为例说明。
在Form1的加载事件中添加:
private void Form1_Load(object sender, EventArgs e)
{
Label label1=new Label()
{
Text=“欢迎来到这里!!!”,
ForeColor = System.Drawing.Color.Red,
Name=”label1”,
AutoSize=true,
Location=new System.Drawing.Point(48, 37);
};
this.Controls.Add(label1);
}
这样就将一个Label控件添加到了Form中。
20. 怎样将一个Form显示在Panel之中?
将Form1作为父窗体,在窗体上放一个Panel控件,将Form2显示在Panel之中。
1) 要将Form2的TopLevel设置为false,因为顶级窗体不能显示在其他控件之中。
2) 将Form2的FormBorderStyle设置为:FormBorderSyle.None。无边框。
3) Form2的Dock设置为:DockStyle.Fill
4) 将Form2.WindowState设置为: FormWindowState.Maximized
5) 将Form2对象添加到Panel的Controls集合中 最后别忘记调用Form2的Show()方法。 Form2添加到Panel的完整代码如下:
panelPage.Controls.Clear();//移除所有控件
Form2 frm2 = new Form2 (); frm2 .TopLevel = false;
frm2 .FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
frm2.Dock=DockStyle.Fill;
frm2.WindowState=FormWindowState.Maximized;
panelPage.Controls.Add(frm2 )
frm2 .Show();
21. Winform布局时,如何实现让GroupBox停靠Form的上边缘?
要让GroupBox停靠在Form窗体的上边缘,说明与Form窗体的上边缘是没有间距的,所以直接设置
GroupBox控件的Dock属性为:top 即可。
22. Winform中如何在子线程中操作窗体或控件?
因为Winform应用程序是单线程的。对于某一个控件来说,只有创建该控件的线程才能修改它的值。对
Winform来说,在窗体中拖一个控件,它由程序的主线程创建。因而,如果我们又另开一个线程,那么
如果我们想要在这个线程中直接去修改该控件的值,就会报错。
那么如果,我们仍然想要改控件的值,该如何做呢?
我们可以通过,在这个子线程中,通过this.Invoke() 或 this.BeginInvoke()的方式通过执行委托的方式, 在委托里去修改,就可以。
代码如下:
This.Invoke(new Action(()=>{
Label1.Text=”您好!”;
}));
23. 如何设置MenuStrip控件中菜单项的快捷键?
菜单项的快捷键有两种设置方式:
(1) Alt快捷键 菜单项Text属性设置的文本末尾加上(&+键码)就可以
(2) Ctrl或Shift快捷键,设置菜单项的ShortcutKeys属性就可以了。
24. 怎么设置StatusStrip控件中项之间的分隔线?
StatusStrip控件中没有分隔线的项,那么 如果各项之间要显示分隔线,怎么办呢?答案很简单。
在StatusStrip中添加一个StatusLabel子项,将它的BorderSides改成Left或Right即可。
25. 如何在修改页面,加载CheckedListBox中已设置的角色列表 (设置选中项)?
假设已设置的角色列表是提供的 List roleIds,CheckedListBox的数据源是List roleList
public static void LoadRoles(CheckedListBox clbRoles, List roleIds)
{
for (int i = 0; i < clbRoles.Items.Count; i++)
{
RoleInfo role=clbRoles.items[i] as RoleInfo;
if (roleIds.Contains(role.RoleId))
{
cblItems.SetItemChecked(i, true);
} }
}
26. 如何将Dictionary<int,string>中存储的信息绑定到ListBox中?
因为ListBox的数据源可以是DataTable或List,但Dictionary却不能直接作为它的数据源。但我们可以利
用BindingSource来作为连接数据源与控件的桥梁。
实现如下:
Dictionary<int,string> userList=new Dictionary<int,string>();
userList.Add(101,”李明”);
userList.Add(102,”刘红”);
userList.Add(103,”张三”);
//绑定数据
comboBox1.DataSource = new BindingSource(dict, null);
comboBox1.ValueMember = "Key";//文本对应的值
comboBox1.DisplayMember = "Value";//显示的文本
27. DataGridView控件中,如何修改列标题栏的样式?
选择DataGridView控件,在属性面板中:
1)设置ColumnHeadersDefaultCellStyle属性,点击进入CellStyle生成器,可设置列单元格的背景 色、字体、文字颜色等
2)设置EnableHeadersVisualStyles为:False
然后列标题栏的样式就生效了。
28. 如何将DataGridView控件中的复选框列绑定int类型的值0和1?
右击DataGridView控件,选择“编辑列”---->打开编辑列窗口,选择复选框列,
1)设置DataPropertyName属性为要绑定的属性名或列名
2)设置 FalseValue为 0,TrueValue为 1
即可。
29. 如何在DataGridView中将显示时间的列格式化成“yyyy-MM-ddHH:mm:ss”格式?
右击DataGridView控件,选择“编辑列”---->打开编辑列窗口,选择显示时间的列,
点击DefaultCellStyle属性右边的小按钮,打开CellStyle编辑器,设置Format设置为:yyyy-MM-dd HH:mm:ss
即可。
30. 如何设置DataGridView中的数据行,交替行呈现?
设置DataGridView的AlternatingRowsDefaultCellStyle属性,点击右边的小按钮,
打开CellStyle编 辑器,设置背景色, 字体、文字颜色,其背景色设置与偶数行的背景一定不相同。
31. DevExpress 控件相对于原生控件,有什么优势?
DevExpress 开发的控件有很强的实力,不仅功能丰富,应用简便,而且界面华丽,可方便定制,提供
的组件能满足企业软件的大部分功能,为企业或开发团队节约开发成本和时间,对于编程人员来说是个
非常好的选择。
基于Winform的Dev控件,提供了不少常用的重量级控件,如 GridControl、ChartControl、TreeList、
BarManager、NavBarControl等等。
32. DevExpress Winform 如何实现单选按钮?
在DevExpress中已经看不到RadioButton控件,只有RadioGroup,但它却不是我们想要的单选按 钮。
其实这里我们仍然使用CheckEdit控件来实现,示例如下:
CheckEdit.Properties.CheckStyle = DevExpress.XtraEditors.Controls.CheckStyles.Radio;
此外,必须确保所设定的所有单选按钮设置RadioGroupIndex相同的索引编号。
33. 在DevExpress中,如何修改SimpleButton的背景色?
要对simplebutton按钮控件设置背景色,除了给其Appearance下的BackColor属性赋值之外,还需要将
ButtonStyle的值,设置为除Default和Office2003之外的其它值,背景色才会起效,否则没有任何改
变。比如将ButtonStyle为Flat。
34. 在DevExpress中,怎样让TextEdit只能输入6位数字?
首先,将TextEdit的 MaskType设置为:Numeric,
然后,将Edit Mask改为:“######”即可。
35. 使用RatingControl,如何使等级呈现半填充效果?
假设等级数ItemCount为5,当前等级Rating为2.5,相邻等级值间隔ValueInterval为1,设置
FillPrecision为:Half
即可呈现出半填充效果。
36. DevExpress Winform基本控件是如何分类的?
基本控件分两大类:BaseEdit和BaseStyleControl,都继承BaseControl,它继承ControlBase,它继 承Control。
BaseStyleControl分类的控件,可设置自身特有的样式(ButtonStyle, HighlightedItemStyle等)。 BaseEdit分类的控件,直接可以通过EditValue属性获取当前控件的值; Properties属性获取控件特有属
性。
37. DevExpress Winform中,如何实现多个图片自动滑动浏览效 果?
使用ImageSlider控件,就可以实现该效果,而且还有两个导航按钮,可以点击向前或向后切换图片,
设置好滑动间隔AutoSlideInterval:1000 、滑动方向AutoSlide:Forward,设置允许轮播
AllowLooping:True。
38. DevExpress Winform中,如何实现警告信息显示?
Dev Winform控件中,有AlertControl组件,支持显示警告窗口,
可以设置在窗口页面右下角或左下角 或左上角或右上角出现,并可设置呈现的效果。
39. 如何在Dev Winform中实现下拉按钮的弹出面板?
可以使用PopupMenu作为DropDownButton的弹出面板,将DropDownButton的
DropDownControl设置为PopupMenu。
40.Winform中,如何实现在复选列表框中选择多项,并同时呈现选 择的值?
如果是使用原生控件,可以使用CheckedListBox控件,需要结合一个文本框TextBox来实现,在
CheckedListBox的ItemCheck事件中处理取得选择的值,再将多个选择的值拼接起来;
如果使用Dev控件的话,使用CheckedComboBoxEdit控件即可实现,该控件的下拉菜单中就显示复选 框列表,用户可以选择多个项目,点击确实后,选择的值就显示在编辑框中。
41. Winform界面设计中,如何使用界面的格局在调整界面尺寸时, 整体做到自适应效果?
1.首先将界面布局分块布局,设置容器控件的Dock或Anchor;如果控件与Form边缘紧靠,就设置
Dock;若与边缘要保持固定边距,就设置Anchor.
2.各局部的控件,也对应设置其Dock或Anchor属性。
42. 如果使用TableLayoutPanel布局,如何实现在一个单元格中放 置多个控件?
在TableLayoutPanel中,一个单元格只能放一个控件,如果某个单元格要放多个控件,可借助容器
控件实现,如Panel或GroupBox等。
43. 如何改变GroupBox的边框颜色?
默认情况下,通过属性是没有办法的;
如果要实现,可以开发一个扩展控件:GroupBoxEx, 派生于GroupBox;
然后扩展一个BorderColor属性,
再重写OnPaint事件,在OnPaint中,绘制BorderColor指定的颜色的边框即可。
44. 如何使Panel面板呈现圆角效果?
普通情况下,这是做不到的,这需通过控件重绘来实现。
实现方式如下:
(1)创建一个用户控件:PanelEx,然后将基类改为Panel
(2) 扩展一个属性Radius,用于设置圆角半径,默认为0,默认是不带圆角
public int Radius
{
get { return radius; }
set
{
radius = value;
Invalidate();
}
}
(3) 重写OnPaint事件,在该事件中,通过控件的Rectangle和Radius,生成圆角矩形路径,并用指 定背景填充。
public static GraphicsPath GetRoundRetangle(Rectangle r,int radius)
{
int d = 2 * radius;
int width = r.Width;
int height = r.Height;
GraphicsPath path = new GraphicsPath();
path.AddArc(0, 0, d, d, 180f, 90f);//左上角圆弧
path.AddArc(width - d - 1, 0, d, d, 270f, 90f);//右上角圆弧
path.AddArc(width - d - 1, height - d - 1, d, d, 0f, 90f);//右下角圆弧
path.AddArc(0, height - d - 1, d, d, 90f, 90f);//左下角圆弧
return path;
}
OnPaint重写:
GraphicsPath path2 = new GraphicsPath();//背景部分圆角矩形
path2 = PaintCommon.GetRoundRetangle(rect, radius);
Graphics g = e.Graphics;//绘图对象
//呈现质量--高质量呈现
g.SmoothingMode = SmoothingMode.AntiAlias;
g.FillPath(b, path2);
然后生成一下,在工具箱中,拖一个PanelEx,设置Radius为3,就会呈现一个圆角的面板了。
45. Winform中,TreeView带复选功能的节点,如何实现子节点与 父节点选中状态一致?
这个功能需要注册TreeView的AfterCheck事件来实现,并且要考虑多级的问题,所以要用递归的思 维。
具体实现如下:
if (e.Action == TreeViewAction.ByKeyboard || e.Action ==
TreeViewAction.ByMouse)
{
//设置当前节点的子节点的勾选处理
SetChildNodesCheckState(e.Node);
}
//递归处理 子节点勾选
private void SetChildNodesCheckState(TreeNode node)
{
foreach (TreeNode child in node.Nodes)
{
child.Checked = node.Checked;
SetChildNodesCheckState(child);
}
}
46. Winform开发中,实现跨页面刷新数据的方式有哪些?
有两种:
1)在子页面定义一个刷新事件,在主页面提供刷新处理程序,并与事件关联;然后在子页面合 适的地方调用事件实现。
2)在子页面定义一个用于刷新的委托,在主页面创建子页面后,将刷新方法签名赋给委托,然 后在子页面合适的地方调用委托。
47. Winform开发中,遇到某数据信息列表分页查询功能时,如何实 现?
首先,要开发一个分页控件,这个可以自已做一个,用组合控件开发方式,实现其基本的翻页功能
和分页信息呈现即可,很简单;
然后,就是需要封装该数据列表的分页查询方法,其具体查询命令可以通过写带分页功能的sql或创
建存储过程,该查询语句或存储过程执行后,需要返回两个结果:1.条件查询符合要求的总数据条数;
2.返回当页的数据列表
最后,将分页控件的总记录数属性设置为返回的总记录数;将DataGridView的DataSource设置为返 回的数据列表;
分页控件效果如下: image-20230130152735159
分页结果类:
public class PageModel<T>
{
public int TotalCount { get; set; }
public List<T> PageList { get; set; }
}
分页查询方法
public PageModel<UserInfo> FindUserList(string keywords,int startIndex, int
pageSize)
{
if (string.IsNullOrEmpty(keywords))
{
strWhere += " and (UserName like @keywords or Phone like @keywords or
Address like @keywords) ";
}
SqlParameter paraKeywords = new SqlParameter("keywords", $"%
{keywords}%");
string sql01="select row_number() over (order by UserId ) as Id, * from
UserInfos where 1=1 "+strWhere;
string sql=$"select count(1) from ({sql01}) as temp;select * from
({sql01}) as temp where Id between {startIndex} and {startIndex + pageSize -
1}";
DataSet ds=GetDataSet(sql,1,paraKeywords);//GetDataSet方法表示执行查询返回
DataSet, 1表示执行的是sql语句
int totalCount=ds.Tables[0].Rows[0][0].ToString();//总记录数
List<UserInfo> list=DbConvert.DataTableToList<UserInfo>(ds.Tables[1],"");//
将DataTable转换为List<UserInfos>, "" 表示所有列都转换
return new PageModel(){ TotalCount=totalCount,PageList=list};
}
绑定DataGridView:
int startIndex=pager.StartRecord; 开始索引
int pageSize=pager.PageSize;//每页显示条数
string keywords=txtKeywords.Text.Trim();
pageModel<UserInfo>
pageModel=userBll.FindUserList(keywords,startIndex,pageSize);
pager.Record=pageModel.TotalCount;
dgvUserList.DataSource=pageModel.PageList;
48. 在Winform开发中,如何实现获取某信息名称的拼音码?
这个很简单。
首先,右击项目,选择管理Nuget程序包,在浏览中,搜索NPinYin,并安装;
然后,创建一个公共类PinYinHelper,在类中封装一个GetSpell方法
获取指定汉字字符的拼音
private static string GetSpell(char chr)
{
var coverchr = NPinyin.Pinyin.GetPinyin(chr);
return coverchr;
}
封装一个获取一个中文字符串的每个汉字的首字母的方法
public static string GetFirstSpell(string strChinese)
{
try
{
if (strChinese.Length != 0)
{
StringBuilder fullSpell = new StringBuilder();
for (int i = 0; i < strChinese.Length; i++)
{
var chr = strChinese[i];
fullSpell.Append(GetSpell(chr)[0]);
}
return fullSpell.ToString().ToUpper();
}
}
catch (Exception e)
{
Console.WriteLine("出错!" + e.Message);
}
return string.Empty;
}
最后,在信息页中,给信息名称的文本框注册一个TextChanged事件,在事件处理程序中,
//生成拼音码
private void txtName_TextChanged(object sender, EventArgs e)
{
string userName = txtName.Text.Trim();
txtPYNo.Text = PingYinHelper.GetFirstSpell(statName);
}
49. 在项目开发中,如何为界面层封装一个通用的异常处理方法?
这个在项目开发中,很重要,异常处理机制的使用很重要,如何使用不恰当,反而适得其反。
可以在项目通用类中,定义一个公共方法,在需要异常处理的地方使用。
try catch异常处理方法
act 表示要执行的过程代码,errTitle 出现异常时消息框的标题,message 异常消息文本
public static void TryCatch(this Action act, string errTItle, string message)
{
try
{
act.Invoke();
}
catch (Exception ex)
{
MessageHelper.Error(errTItle, ex.Message);
}
}
在某按钮的处理程序中,这样写:
private void btnOK_Click(object sender, EventArgs e)
{
Action act=()=>{
int age=int.Parse(txtAge.Text);
string remark=txtRemark.Text;
string name=txtName.Text;
}
act.TryCatch("提交错误","提交信息出现异常!");
}
这样,就不用写try {} catch{} 结构这么麻烦了。
50. DataGridView中,实现行选择功能时,为什么要失去焦点时, 才能取得复选单元格的状态值?
要解决这个问题,需要注册DataGridView控件的CurrentCellDirtyStateChanged事件才行。
这样写就行:
private void dgvUserist_CurrentCellDirtyStateChanged(object sender, EventArgs
e)
{
dgvUserist.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
然后,你再去操作就可以了。