很多系统都带有自定义报表的功能,而此功能都需依参数自动生成控件,举例如下:

  

  如上图,一条查询语句当中,包含了3个参数,其中两个是日期型(使用:DATE!进行标识),一个是字符型(使用:进行标识),要生成的效果图如下所示:

  

  代码如下:

private void FrmDefine_MyEventClose(string strID, string strName, string strSql)
{
//值传递
ReturnID = strID;
ReturnName = strName;
ReturnSql = strSql;
//空格清除
while (ReturnSql.IndexOf(": ") != -)
{
ReturnSql = ReturnSql.Replace(": ", ":");
}
while (ReturnSql.IndexOf(":DATE! ") != -)
{
ReturnSql = ReturnSql.Replace(":DATE! ", ":DATE!");
}
//产生标题
rtxtName.Text = "[" + strID + "]" + strName;
rtxtName.SelectionAlignment = System.Windows.Forms.HorizontalAlignment.Center;
//清除控件
splitContainer2.Panel1.Controls.Clear();
//添加控件
if (strSql.IndexOf(":") != -)
{
int ParamIndex = ; //参数序号,从100往前倒数。
ParamSql = string.Empty;
List<string> list = new List<string>(ReturnSql.Split(' '));
for (int i = list.Count - ; i > -; i--)
{
if (list[i].IndexOf(":") == -)
{
ParamSql = list[i] + " " + ParamSql;
list.RemoveAt(i);
}
else
{
if (list[i].IndexOf(":DATE!") != -)
{
if (list[i].IndexOf(":DATE!") == )
{
ParamSql = "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
else
{
ParamSql = list[i].Substring(, list[i].IndexOf(":DATE!")) + "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
}
else
{
if (list[i].IndexOf(":") == )
{
ParamSql = "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
else
{
ParamSql = list[i].Substring(, list[i].IndexOf(":")) + "Params[" + ParamIndex.ToString() + "] " + ParamSql;
ParamIndex--;
}
}
}
}
//添加控件
if (list.Count > )
{
//坐标初始化
Point point = new Point(, );
//控件行数
int intRow = ;
//以6个参数为一行,初始化控件面板的高度。
splitContainer2.SplitterDistance = * Convert.ToInt32(Math.Ceiling(list.Count / 6.0));
//控件添加
ParamIndex = - list.Count + ;
for (int i = ; i < list.Count; i++)
{
string strLabelText = string.Empty;
if (i % == && i != )
{
intRow++;
point.X = ;
point.Y = + * intRow;
}
//日期及文本
if (list[i].IndexOf(":DATE!") != -)
{
//Label
strLabelText = list[i].Substring(list[i].IndexOf(":DATE!") + , list[i].Length - list[i].IndexOf(":DATE!") - );
Label label = new Label();
label.Name = "Label" + i.ToString();
label.Text = strLabelText;
label.AutoSize = true;
label.Location = point;
splitContainer2.Panel1.Controls.Add(label);
//DateTimePicker
DateTimePicker dateTimePicker = new DateTimePicker();
dateTimePicker.Name = "Params[" + ParamIndex.ToString() + "]";
dateTimePicker.Format = DateTimePickerFormat.Custom;
dateTimePicker.CustomFormat = "yyyy-MM-dd";
dateTimePicker.Width = ;
point.X = point.X + label.Width + ;
point.Y = label.Location.Y - ;
dateTimePicker.Location = point;
splitContainer2.Panel1.Controls.Add(dateTimePicker);
//坐标初始化
point.X += ;
point.Y = label.Location.Y;
}
else
{
//Label
strLabelText = list[i].Substring(list[i].IndexOf(":") + , list[i].Length - list[i].IndexOf(":") - );
Label label = new Label();
label.Name = "Label" + i.ToString();
label.Text = strLabelText;
label.AutoSize = true;
label.Location = point;
splitContainer2.Panel1.Controls.Add(label);
//TextBox
TextBox textBox = new TextBox();
textBox.Name = "Params[" + ParamIndex.ToString() + "]";
textBox.Text = string.Empty;
textBox.Width = ;
point.X = point.X + label.Width + ;
point.Y = label.Location.Y - ;
textBox.Location = point;
splitContainer2.Panel1.Controls.Add(textBox);
//坐标初始化
point.X += ;
point.Y = label.Location.Y;
}
//参数序号赋值
ParamIndex++;
}
}
}
//数据源初始化
dataGridView1.DataSource = null;
}

  好了,分享就到这里,希望对大家有一些帮助。

c#依参数自动生成控件的更多相关文章

  1. 嵌套在母版页中的repeater自动生成控件ID

    注:如果直接在后台通过e.Item.FindControl()方法直接找控件,然后再通过对其ID赋值,在编译之后会出现“母版页名称_ID“类似的很长的ID值(详情点击) 解决方法:<asp:Co ...

  2. Silverlight动态生成控件实例

    刚学习Silverlight,做了一个动态创建控件的实例 实现结果:根据已有的控件类名称,得到控件的实例化对象 实现思路1:就是定义一个模板文件,将类名做为参数,在silverlight中使用Srea ...

  3. Atitit.auto complete 自动完成控件的实现总结

    Atitit.auto complete  自动完成控件的实现总结 1. 框架选型 1 2. 自动完成控件的ioc设置 1 3. Liger  自动完成控件问题 1 4. 官网上的code有问题,不能 ...

  4. Asp.net web form 动态生成控件的注意事项

    Asp.net页面生命周期 页面初始化          Page_Init   加载View State      LoadViewState    回发数据处理      LoadPostData ...

  5. C#控件数组批量生成控件

    在编写C#窗体应用程序的时候,有时候需要生成好多个功能相似的同一种控件(比如数字键盘按键.单选框等),这时候使用窗体编辑器,费时费力,不便于修改.因此可以采用批量生成控件的形式. 以批量生成按钮为例 ...

  6. Asp.net中使用文本框的值动态生成控件的方法

    这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个“花 ...

  7. WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)

    原文:WPF: WrapPanel 容器的数据绑定(动态生成控件.遍历) 问题:        有一些CheckBox需要作为选项添加到页面上,但是数目不定.而为了方便排版,我选择用WrapPanel ...

  8. Winforn中使用代码动态生成控件

    场景 有时候需要根据配置文件在窗体中使用代码动态生成控件. 比如读取xml配置文件中的节点数量,然后在窗体中生成指定数量的RadioGroup控件. 实现 新建一个窗体,在窗体的加载完之后的事件中 p ...

  9. winform 自定义自动完成控件

    做过前端的朋友肯定很清楚自动完成控件,很多优秀的前端框架都会带有自动完成控件,同样的,winform也有,在我们的TextBox和ComboBox中,只需要设置AutoCompleteSource属性 ...

随机推荐

  1. vue脚手架搭建的具体步骤

    1.全局安装cli npm install -g vue-cli 在全局安装vue的命令行工具 2.初始化项目 vue init webpack my-project   初始化一个基于webpack ...

  2. 解决maven update project 后项目jdk变成1.5的问题

    一.问题描述 在Eclipse中新建了一个Maven工程, 然后更改JDK版本为1.7, 结果每次使用Maven > Update project的时候JDK版本都恢复成1.5. 二.原因分析 ...

  3. tomcat优化(转)

    tomcat优化 Activiti  分享牛  2017-02-08  1132℃ 本文重点讲解tomcat的优化. 基本优化思路: 1.         尽量缩短单个请求的处理时间. 2.      ...

  4. apm飞行模式

    参考 :https://www.cnblogs.com/jins-note/p/9580054.html   复制别人的,因为很久(几年)玩一次,所以会忘,也不好找,,若作者要求,请给留言,会立即删除 ...

  5. raiDrive添加坚果云

    把坚果云网盘映射到本地. 使用raidrive 中webDAV添加坚果云. 1.登录自己的坚果云网页版,点“安全选项”,右侧有第三方应用管理,生成密码,按照示例填入第三方应用即可. 2.注意:暂时此处 ...

  6. shell脚本清空redis库缓存

    前提: 现在做的一个业务系统,用了redis做缓存. 系统做了缓存,通常在系统正常使用的过程中,可以节省很多系统资源,特别是数据库资源. 但是,在开发.测试或者系统遇到问题的时候,也有很麻烦的事情. ...

  7. 02.制作一个自己的 Java 编辑器

    难度中等,适合 Java 基础扎实,对 Java 核心 API 有所熟悉的同学学习 No1.制作GUI界面 一.实验介绍 1.1 实验内容 本节课程的主要内容是准备开发环境,建立项目并完成 GUI 界 ...

  8. web-Amazon

    一 准备实验数据 1.1.下载数据 wget http://snap.stanford.edu/data/amazon/all.txt.gz 1.2.数据分析 1.2.1.数据格式 product/p ...

  9. 2018.11.06 bzoj1093: [ZJOI2007]最大半连通子图(缩点+拓扑排序)

    传送门 先将原图缩点,缩掉之后的点权就是连通块大小. 然后用拓扑排序统计最长链数就行了. 自己yyyyyy了一下一个好一点的统计方法. 把所有缩了之后的点都连向一个虚点. 然后再跑拓扑,这样最后虚点的 ...

  10. ORACLE 导入的问题

    1.导入报错 我将ORACLE12.2 导出的文件,导入到ORACLE12.1 . IMP-00010: 不是有效的导出文件, 标头验证失败 解决办法: 修改 dmp 文件版本,使用UEDITOR打开 ...