转载:

http://blog.163.com/zjlovety@126/blog/static/2241862420106128264300/

也不知道是否该应用这个控件,不过也想不出该用其他什么控件,关键是俺比较菜没什么经验。

要求是这样的,用户一次添加一个任务,这个任务有三个选项,其中两个选项是用户动态输入的名称(就象图中bb和dd两列),另一个选项则是一堆数据(就象qq那列),我现在要把每个任务罗列出来,不能用treeview,不能用tabcontrol,不能用xml,最好象个表格一样清晰明朗(疯了!)每个任务对应两个按钮,一个是Run,为了跑任务,一个是Remove,为了移除任务。

当然最开始选择DataGridView就是为了满足那个“象表格一样清晰明朗”的奇怪需求,一行对应一个任务,其次貌似DataGridView控件在.net 2.0中加入了新的特征如DataGridViewButtonColumn啊,DataGridViewComboBoxColumn之类的东东。研究了一天才发现这两个东东根本派不上用场,首先DataGridViewButtonColumn中的Button跟真的Button根本没得比,既不能添加Button的Text也不好添加Click事件(应该是有方法的但还是很别扭而且也没研究);其次是DataGridViewComboBoxColumn,不仅外观上不能和真正的ComboBox相提并论,而且当你选择了其中的任一item,DataGridView就会新增一行,这跟我们的需求是完全不符合的,毕竟一个选项是不能代表一个任务的。

从网上查了很多资料,呵呵,看到一篇说可以画个控件上去,觉得很有意思。其实我就是这么做的。

(1)首先初始化DataGridView控件。

private void Form1_Load(object sender, EventArgs e)

{

DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();

columnHeaderStyle.BackColor = Color.Beige;

columnHeaderStyle.Font = new Font("Verdana", 10, FontStyle.Bold);

dataGridView1.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

this.dataGridView1.Columns.Add("1", "bb");

this.dataGridView1.Columns.Add("2", "qq");

this.dataGridView1.Columns.Add("3", "dd");

this.dataGridView1.Columns.Add("4", "aa");

}

(2)单击按钮添加一行,包括单元格和单元格的值,看似内嵌在单元格中的按钮和下拉列表

private void button4_Click(object sender, EventArgs e)

{

DataGridViewRow dr = new DataGridViewRow();

foreach (DataGridViewColumn c in this.dataGridView1.Columns)

{

dr.Cells.Add(c.CellTemplate.Clone() as DataGridViewCell);  //给行添加单元格

}

dr.Cells[0].Value = "1111";

dr.Cells[2].Value = "3333";

this.dataGridView1.Rows.Add(dr);

int index = this.dataGridView1.Rows.Count - 2;

ComboBox com = new ComboBox();

com.Name = "Containers" + index.ToString(); ;

com.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;

com.FlatStyle = System.Windows.Forms.FlatStyle.Flat;

com.Items.AddRange(new object[] {

"1",

"2",

"3",

"4"});

com.SelectedIndex = 0;

this.dataGridView1.Controls.Add(com);

this.dataGridView1.Columns[1].Width = com.Width;

com.Location = newSystem.Drawing.Point(((this.dataGridView1.GetCellDisplayRectangle(1, index,true).Right) - (com.Width)), this.dataGridView1.GetCellDisplayRectangle(1, index,true).Y);

Button btn1 = new Button();

btn1.Name = "btnRun" + index.ToString(); ;

btn1.Text = "Run";

btn1.Click+=new EventHandler(btn1_Click);

Button btn2 = new Button();

btn2.Name = "btnRemove"+index.ToString();

btn2.Text = "Remove";

btn2.Click+=new EventHandler(btn2_Click);

this.dataGridView1.Controls.Add(btn1);

this.dataGridView1.Controls.Add(btn2);

this.dataGridView1.Columns[3].Width = btn1.Width + btn2.Width + 6;

btn1.Location = newSystem.Drawing.Point(((this.dataGridView1.GetCellDisplayRectangle(3, index,true).Left)), this.dataGridView1.GetCellDisplayRectangle(3, index, true).Y);

btn2.Location = new System.Drawing.Point(((this.dataGridView1.GetCellDisplayRectangle(3, index,true).Right-1) - (btn2.Width)), this.dataGridView1.GetCellDisplayRectangle(3, index,true).Y);

}

(3)为(2)中生成的Run按钮和Remove按钮添加单击事件处理程序

public void btn1_Click(object sender, EventArgs e)

{

this.richTextBox1.Text = "";

Button btn = (Button)(sender);

//这个btn的name是btnRun打头的

string suffix = btn.Name.ToString().Substring(6); //后边那个号,相当于index的string

Control c = findControlByName(suffix);  

if (c != null)

{

ComboBox com = (ComboBox)(c);

       //Control ctl1 = this.dataGridView1.Controls["Containers" + i.ToString()];

        //ComboBox com = (ComboBox)ctl1;  其实这样写更简单点

for (int i = 0; i < com.Items.Count; i++)

{

this.richTextBox1.Text += com.Items[i].ToString() + "\n";

}

}

}

public void btn2_Click(object sender, EventArgs e)

{

      int RowCount = this.dataGridView1.Rows.Count;

      Button btn = (Button)(sender);

//这个btn的name是btnRemove打头的

string suffix = btn.Name.ToString().Substring(9);  //后边那个号,相当于index的string

this.dataGridView1.Controls.RemoveByKey(btn.Name);

this.dataGridView1.Controls.RemoveByKey("btnRun" + suffix);

this.dataGridView1.Controls.RemoveByKey("Containers" + suffix);

int index = Convert.ToInt32(suffix);

this.dataGridView1.Rows.RemoveAt(index);

     if (index < RowCount - 2)

{

for (int i = index + 1; i < RowCount - 1; i++)

{

Control ctl1 = this.dataGridView1.Controls["Containers" + i.ToString()];

Control ctl2 = this.dataGridView1.Controls["btnRun" + i.ToString()];

Control ctl3 = this.dataGridView1.Controls["btnRemove" + i.ToString()];

ComboBox com = (ComboBox)ctl1;

Button btnRun = (Button)ctl2;

Button btnRemove = (Button)ctl3;

//上移一格,单元格Height位4,Button的Height为23

com.Location = new System.Drawing.Point(com.Location.X, com.Location.Y - 23);

btnRun.Location = new System.Drawing.Point(btnRun.Location.X, btnRun.Location.Y - 23);

btnRemove.Location = new System.Drawing.Point(btnRemove.Location.X, btnRemove.Location.Y - 23);

//改名字的后缀

int j=i-1;

com.Name = "Containers" + j.ToString();

btnRun.Name = "btnRun" + j.ToString();

btnRemove.Name = "btnRemove" + j.ToString();

}

}

}

(4)btn1_Click处理中用到的函数findControlByName()

public Control findControlByName(string suffix)

{

foreach (System.Windows.Forms.Control c in this.dataGridView1.Controls)

{

if (c.Name == "Containers" + suffix)

return c;

}

return null;

}

写的比较累赘,不知道还有什么更好的方法。请经验人士赐教^_^

转载于:https://www.cnblogs.com/timeover/archive/2010/09/15/1826900.html

DataGridView控件初始化,添加删除行(不绑定数据库)相关推荐

  1. 转——C# DataGridView控件 动态添加新行

    DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...

  2. C# DataGridView控件动态添加新行

    目录 方法一: 方法二: ① DataGridView 取得或者修改当前单元格的内容: ② DataGridView 设定单元格只读: ③ DataGridView 不显示最下面的新行: ④ Data ...

  3. ASP.NET中DropDownList控件的简单使用--DDL绑定数据库表中值,选择DDL中值直接检索数据...

    1.在.aspx页面拖入DropDownList控件 <label class="txt-green">校区:</label> <asp:DropDo ...

  4. C#中DataGridView控件使用大全

    c datagridview 分类: C/C++/C# DataGridView 动态添加新行: DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自 ...

  5. C# DataGridView控件动态添加行与列

    DataGridView控件在实际应用中非常实用,特别需要表格显示数据时.可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行.假如需要动态为DataGridView控件添加新行, ...

  6. WinForm中关于DataGridView控件的一些应用

    转载于新浪 美林居士 的博客:            blog.sina.com.cn/s/blog_797a56d20101daiw.html4 在.NET4.0中,以表格形式存储的数据通常是Dat ...

  7. [ExtJs] 控件初始化绑定事件 initialize 和 painted的区别

    在使用ExtJs时,对于一些页面控件在初始化时希望绑定事件用于值修改时触发,通常会在控件初始化或控件展示时绑定. 一般常用的事件主要有initialize.added.beforeshow.activ ...

  8. vb.net 教程 3-10 窗体编程 datagridview控件 3 禁止追加行 与 禁止删除行

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 如<vb.net 教程 3-10 窗体编程 datagridview控件 1 初步 > ...

  9. Winform实现在DataGridView控件的单元格中添加多个控件

    Winform实现在DataGridView控件的单元格中添加多个控件 背景 实现思路 关键代码 完整代码下载 背景 DataGridView控件的列是支持TextBoxColumn.ComboBox ...

最新文章

  1. php缓存数据到本地缓存,本地缓存localStorage的使用方法
  2. 读取String数组内的内容
  3. 对某bc站的一次渗透测试
  4. 学习笔记二:异步FIFO
  5. dbgrid 获取前台页面参数
  6. php在线编辑器_8款功能强大的Java编辑器,建议收藏!「渡一教育」
  7. MFC:VS拖拽多个文件到控件并获取路径
  8. Mac上的MySQL可视化工具总结
  9. 哈佛幸福课 24种人格力量测试
  10. 移动端Retina屏boder 1px显示为2px或3px的解决方法
  11. 咸鱼Maya笔记—Maya 编辑法线
  12. spamhaus反垃圾邮件联盟黑名单PBL申诉详细步骤
  13. 前端对用户身份证号码进行验证以及模糊显示
  14. [创业之路-50] :动态股权机制 -5- 创业公司股权分配常见的坑
  15. QT的QList排序
  16. JAVA spring hessian_Springboot写的Hessian例子
  17. 通过各种统计方法建立理想的mlb投球前景
  18. 考研英语(七)——状语和状语从句
  19. 数据手册中最小值、最大值、典型值三者之间的关系
  20. 教你如何搭建人事OA-员工管理系统,demo可分享

热门文章

  1. css 透明背景_css 中多种边框的实现小窍门
  2. linux-shell命令之file【辨识文件类型】
  3. LeetCode Hot100 ---- 动态规划专题
  4. fort77编译器安装
  5. spring boot系列 1: 第一个spring boot: Hello prj
  6. 【语义分割】PSPNet:Pyramid Scene Parsing Network
  7. 卷积神经网络经典模型要点
  8. 使用Scikit-learn,Spotify API和Tableau Public进行无监督学习
  9. 贝叶斯优化神经网络参数_贝叶斯超参数优化:神经网络,TensorFlow,相预测示例
  10. 使用Python构建推荐系统的机器学习