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

  

  如上图,一条查询语句当中,包含了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. install virtualenv

    $ [sudo] pip install virtualenv $ mkdir ~/envs $ virtualenv ~/envs/lsbaws/ $ cd ~/envs/lsbaws/ $ ls ...

  2. js中将斜杠\替换的方法

    js中将/替换的方法replace(/\//g, '-') 中间涉及到js的一些转义问题,试了几个方法,发现这个可以,就记下来.

  3. 移动开发学习touchmove

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. svn log — 显示提交日志信息

    http://www.cnblogs.com/eoiioe/archive/2009/01/06/1370580.html 概要svn log [PATH]svn log URL [PATH...]描 ...

  5. decode 横竖转换

    select rq 日期,sum(decode(shengfu,'胜',1,'负',0)) 胜,sum(decode(shengfu,'负',1,'胜',0)) 负 from tmp group by ...

  6. NETCLR via C#第四版(文摘)

    第1部分 CLR基础 第1章 CLR的执行模型 第2章 生成,打包,部署和管理应用程序及类型 第3章 共享程序集和强命名程序集 第2部分 设计类型 第4章 类型 第5章 基元类型 引用类型和值类型 第 ...

  7. (17)Questioning the universe

    https://www.ted.com/talks/stephen_hawking_asks_big_questions_about_the_universe/transcript00:13There ...

  8. s4-2 ALOHA 协议

    多路访问协议  随机访问协议(Random Access) 特点:站点争用信道,可能出现站点之间的冲突 典型的随机访问协议 • ALOHA协议 • CSMA协议 • CSMA/CD协议(以太网采 ...

  9. c#中委托与事件

    参考:http://www.tracefact.net/tech/009.html 张子阳:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/9 ...

  10. mouseover和mouseout事件的相关元素

    在发生mouseover和mouseout事件时,还会涉及更多的元素,这两个事件都会涉及把鼠标指针从一个元素的边界之内移动到另一个元素的边界之内.对mouseover事件而言,事件的主目标获得光标元素 ...