#1024程序员节|征文#
怎样将一个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();
Winform开发中,遇到某数据信息列表分页查询功能时,如何实现?
首先,要开发一个分页控件,这个可以自已做一个,用组合控件开发方式,实现其基本的翻页功能 和分页信息呈现即可,很简单; 然后,就是需要封装该数据列表的分页查询方法,其具体查询命令可以通过写带分页功能的sql或创 建存储过程,该查询语句或存储过程执行后,需要返回两个结果:
1.条件查询符合要求的总数据条数;
2.返回当页的数据列表 最后,将分页控件的总记录数属性设置为返回的总记录数;将DataGridView的DataSource设置为返 回的数据列表;
分页结果类:
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
死锁的必要条件?怎么克服?
系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。
什么是死锁?死锁(Deadlock):是指两个或两个以上的进程在运行过程中,因争夺资源而造成的一种互相等待(谁也无法再继续推进)的现象,若无外力作用,它们都将无法推进下去。
死锁的四个必要条件:
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
处理死锁的策略
-
避免使用锁:
- 尽可能使用无锁编程技术,如原子操作、CAS(Compare-And-Swap)操作等。
- 使用并发数据结构,这些数据结构通常是为了线程安全而设计的,不需要显式锁定。
-
锁顺序:
- 如果必须使用锁,确保所有线程以相同的顺序获取锁。这可以防止循环等待条件,从而避免死锁。
-
锁超时:
- 使用尝试锁定(try-lock)机制,并设置超时时间。如果在一个合理的时间内无法获取所有需要的锁,线程可以释放已持有的锁并重试。
-
死锁检测:
- 实现或使用现有的死锁检测算法,定期检查系统中是否存在死锁,并在检测到死锁时进行处理。
-
资源分配图:
- 维护一个资源分配图,当进程请求资源时,检查是否会形成循环等待。如果是,则拒绝请求。
-
一次性分配所有资源:
- 如果可能,一次性分配所有必需的资源,这样可以避免在执行过程中争夺资源。
-
使用高级同步原语:
- 使用如信号量、屏障(barriers)、条件变量等同步原语,它们提供了比基本锁更细粒度的控制。
-
死锁恢复策略:
- 实现一种机制,当检测到死锁时,可以终止一个或多个进程,释放资源,以打破死锁。
-
减少锁的范围和持有时间:
- 尽量减少持有锁的代码范围,只在必要时持有锁,并尽快释放。
-
优先级继承:
- 如果线程因等待资源而被阻塞,它可以继承持有该资源的线程的优先级,以减少优先级反转问题。
-
使用死锁避免算法:
- 如银行家算法,它在分配资源之前预先计算是否会发生死锁,如果会发生,则不分配资源。
-
教育和代码审查:
- 对开发人员进行多线程编程和死锁避免的培训,并通过代码审查来识别和修复潜在的死锁问题。
-
使用并发库和框架:
- 利用现代编程语言和框架提供的并发库,这些库通常提供了避免死锁的设计。
-
监控和日志记录:
- 实施实时监控系统,记录锁的获取和释放,以便在发生死锁时可以快速定位问题。