传统的Winform界面可以使用SplitContainer控件
在现有已生成界面的基础上,把查询部分和列表部分的控件拖动小一点,然后把上述分隔控件拖动到界面后,在右边面板放入已有的查询和分页控件部分的内容,中间状态的列表界面效果如下所示。
然后在左边放入一个GroupControl控件,并加入树形控件TreeView,这样我们调整后的设计界面效果如下所示。
首先我们需要在代码里面绑定树的初始化代码,生成需要快速查询的内容,示意代码如下所示。主要逻辑思路就是,从数据字典中检索相关的分类,然后绑定一些查询条件,方便后面的处理。
private void InitTree()
{
base.LoginUserInfo = Cache.Instance["LoginUserInfo"] as LoginUserInfo
this.treeView1.BeginUpdate()
this.treeView1.Nodes.Clear()
//添加一个未分类和全部客户的组别
TreeNode topNode = new TreeNode("所有记录", 0, 0)
this.treeView1.Nodes.Add(topNode)
TreeNode CategoryNode = new TreeNode("客户活动类别", 2, 2)
this.treeView1.Nodes.Add(CategoryNode)
AddDictData(CategoryNode, 0, "Category")
TreeNode OrderYearNode = new TreeNode("记录年度", 8, 8)
this.treeView1.Nodes.Add(OrderYearNode)
List<string>yearList = BLLFactory<Maintenace>.Instance.GetYearList()
foreach (string year in yearList)
{
TreeNode subNode = new TreeNode(year, 0, 0)
subNode.Tag = year
OrderYearNode.Nodes.Add(subNode)
}
this.treeView1.ExpandAll()
this.treeView1.EndUpdate()
}为了处理树形列表的节点的单击事件,我们可以在其AfterSelect事件进行处理,示意代码如下所示。主要逻辑就是根据及节点和条件的不同,进行不同的处理。
string treeConditionSql = ""
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
if (e.Node != null &&e.Node.Tag != null)
{
if (e.Node.FullPath.Contains("记录年度"))
{
int year = Convert.ToInt32(e.Node.Tag.ToString())
SearchCondition condition = new SearchCondition()
condition.AddCondition("StartTime", Convert.ToDateTime(string.Format("{0}-01-01", year)), SqlOperator.MoreThanOrEqual)
condition.AddCondition("StartTime", Convert.ToDateTime(string.Format("{0}-01-01", year + 1)), SqlOperator.LessThan)
treeConditionSql = condition.BuildConditionSql().Replace("Where", "")
BindData()
}
else
{
treeConditionSql = e.Node.Tag.ToString()
BindData()
}
}
else
{
treeConditionSql = ""
BindData()
}
}上面的代码,我们定义了一个局部变量treeConditionSql 用来存储树列表单击后的条件,触发单击事件后,我们最终还是传回给标准列表界面已有的查询 *** 作--BindData函数进行处理。
BindData里面最主要的 *** 作就是构造查询条件,构造条件的语句如下所示,通过SearchCondition对象处理进行使用多数据库的兼容处理。
/// <summary>
/// 根据查询条件构造查询语句
/// </summary>
private string GetConditionSql()
{
//如果存在高级查询对象信息,则使用高级查询条件,否则使用主表条件查询
SearchCondition condition = advanceCondition
if (condition == null)
{
condition = new SearchCondition()
condition.AddCondition("Category", this.txtCategory.Text.Trim(), SqlOperator.Like)
condition.AddCondition("Title", this.txtTitle.Text.Trim(), SqlOperator.Like)
condition.AddDateCondition("StartTime", this.txtStartTime1, this.txtStartTime2)//日期类型
condition.AddCondition("Contact", this.txtContact.Text.Trim(), SqlOperator.Like)
condition.AddCondition("Place", this.txtPlace.Text.Trim(), SqlOperator.Like)
}
string where = condition.BuildConditionSql().Replace("Where", "")
//如果是单击节点得到的条件,则使用树列表的,否则使用查询条件的
if (!string.IsNullOrEmpty(treeConditionSql))
{
where = treeConditionSql
}
return where
}最终绑定数据的函数BindData的逻辑代码如下所示。
/// <summary>
/// 绑定列表数据
/// </summary>
private void BindData()
{
//entity
this.winGridViewPager1.DisplayColumns = "Customer_ID,HandNo,Category,Title,Content,StartTime,EndTime,Contact,ContactPhone,ContactMobile,Place,PlaceAddress,PlacePhone,Note,Editor,EditTime"
this.winGridViewPager1.ColumnNameAlias = BLLFactory<Activity>.Instance.GetColumnNameAlias()//字段列显示名称转义
string where = GetConditionSql()
List<ActivityInfo>list = BLLFactory<Activity>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo)
this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<ActivityInfo>(list)
this.winGridViewPager1.PrintTitle = "客户活动管理报表"
}这样我们就完成了树形列表和分页查询整合一起的数据查询处理逻辑,从而实现我们说需要的结果,这样的界面在某种程度上,给我们提供更多的方便,更好的体验。
可以使用TabControl,然后在它的TabPage上面再加载一个TabContrl来处理。TabControl的属性->行为->Alignment这个属性有四个值:Top、Bottom、Left、Right,可以分别将TabControl中的TabPage的标签页显示到顶部、下面、左边和右边,你右键看一下属性就明白了,当然也可以用其它的控件,比如TreeView之类的。希望对你有帮助,还有疑问请追问或是Hi介意你不要用四个按钮的形式做分页(因为我以前也是这么做的,结果发现不理想),你可以到网上下载一个。net的分页控件。配合该控件的分页代码,网上也是有很多的,实在差不多代码,在问我。我去找找以前做的。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)