none
关于循环创建DataGridView并手动赋值的疑问······· RRS feed

  • 问题

  •         private void ceshi(int year,int month)
            {

                List<DataGridView> list = new List<DataGridView>();
                for (int i = 0; i < month; i++)
                {
                    int dayNum = DateTime.DaysInMonth(year, i+1);
                    DataGridView dgvn = new DataGridView();
                    dgvn.ColumnHeadersHeight = 40;
                    dgvn.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
                    dgvn.Dock = DockStyle.Top;
                    dgvn.Height = dayNum*20+70;

                   

                    foreach (DataGridViewTextBoxColumn dgvc in dataGridView1.Columns)
                    {
                        DataGridViewTextBoxColumn dgvcNew = new DataGridViewTextBoxColumn();
                        dgvcNew.DataPropertyName = dgvc.DataPropertyName;
                        dgvcNew.HeaderText = dgvc.HeaderText;
                        dgvn.Columns.Add(dgvcNew);
                    }
                    list.Add(dgvn);
                }

                //循环添加到Panel中去
                for (int i = list.Count; i > 0; i--)
                {
                    //获取对应的要添加的DataGridView
                    DataGridView dgvn = list[i-1];

                    int dayNum = DateTime.DaysInMonth(year, i);
                    for (int i_temp = 1; i_temp <= dayNum; i_temp++)
                    {
                        dgvn.Rows.Add(1);
                       //可以自己设置要绑定的数据,到每一条上
                        dgvn.Rows[i_temp].Cells[0].Value = i;
                        dgvn.Rows[i_temp].Cells[1].Value = i * 10;
                        dgvn.Rows[i_temp].Cells[2].Value = (i * 10).ToString() + "年";
                        dgvn.Rows[i_temp].Cells[3].Value = (i * 10).ToString() + "W";  
                    }
                    dgvn.Rows[1].Cells[0].Value = i;
                    dgvn.Rows[1].Cells[1].Value = i * 10;
                    dgvn.Rows[1].Cells[2].Value = (i * 10).ToString() + "年";
                    dgvn.Rows[1].Cells[3].Value = (i * 10).ToString() + "W";  

                    Label lb = new Label();
                    lb.Height = 15;
                    lb.Dock = DockStyle.Top;
                    lb.Text = (i).ToString()+"月份";
                    this.panel1.Controls.Add(lb);
                    this.panel1.Controls.Add(dgvn);
                }
            }
    只要代码如上,传入的参数为,2009,12;
    在界面上创建了一个panel和一个4列的DataGridView;DatagridView隐藏

    而使用以上方法得到的界面显示效果是,行数正确但所有DatagridView的单元格除了
    在循环外赋值的索引为一的行以外全部没有值为空的;***

    请教下原因何在·

    2010年9月27日 9:35

答案

  • 没有进行数据源的绑定。而后我将代码改为如下形式以后,一切正常数据正常显示。

            /// <summary>

            /// 动态添加DataGridView

            /// </summary>

            /// <param name="year">年份</param>

            /// <param name="month">显示前几个月</param>

            private void ceshi(int year,int month)

            {

                List<DataGridView> list = new List<DataGridView>();

     

                for (int i = 0; i < month; i++)

                {

                    int dayNum = DateTime.DaysInMonth(year, i+1);

                    DataGridView dgvn = new DataGridView();

                    dgvn.ColumnHeadersHeight = 40;

                    dgvn.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

                    dgvn.Dock = DockStyle.Top;

                    dgvn.Height = dayNum*20+70;

     

     

                    foreach (DataGridViewTextBoxColumn dgvc in dataGridView1.Columns)

                    {

                        DataGridViewTextBoxColumn dgvcNew = new DataGridViewTextBoxColumn();

                        dgvcNew.DataPropertyName = dgvc.DataPropertyName;

                        dgvcNew.HeaderText = dgvc.HeaderText;

                        dgvn.Columns.Add(dgvcNew);

                    }

                    list.Add(dgvn);

                }

     

                //循环添加到Panel中去

                for (int i = list.Count; i > 0; i--)

                {

                    //获取对应的要添加的DataGridView

                    DataGridView dgvn = list[i-1];

     

                    int dayNum = DateTime.DaysInMonth(year, i);

     

                    //dgvn = DBGV(dayNum, dgvn);

     

                    for (int numTemp = 0; numTemp < dayNum; numTemp++)

                    {

                        dgvn.Rows.Add(1);

                        dgvn.Rows[numTemp].Cells[0].Value = numTemp+1;

                        dgvn.Rows[numTemp].Cells[1].Value = i * 10;

                        dgvn.Rows[numTemp].Cells[2].Value = (i * 10).ToString() + "年";

                        dgvn.Rows[numTemp].Cells[3].Value = (i * 10).ToString() + "W";   

                    }

     

                    Label lb = new Label();

                    lb.Height = 15;

                    lb.Dock = DockStyle.Top;

                    lb.Text = (i).ToString()+"月份";

                    this.panel1.Controls.Add(lb);

                    this.panel1.Controls.Add(dgvn);

                }

            }

     

    而这段代码与上面几乎一样

    • 已标记为答案 天驰 2010年10月18日 1:30
    2010年9月28日 8:21

全部回复

  • 我注意到你是把原先的某个已经绑定到DataGridView中的列运用编程技术移动到动态的DataGridView中,然后添加行。会不会是因为已经绑定到一个数据源之后如果你动态赋值会失效(类似与Dropdownlist绑定到一个数据源之后再赋值是无法赋值的)?

    建议完全舍弃绑定,从列开始自己创造一个独立的(非绑定的DataGridView试试看。)

    2010年9月28日 3:07
    版主
  • 没有进行数据源的绑定。而后我将代码改为如下形式以后,一切正常数据正常显示。

            /// <summary>

            /// 动态添加DataGridView

            /// </summary>

            /// <param name="year">年份</param>

            /// <param name="month">显示前几个月</param>

            private void ceshi(int year,int month)

            {

                List<DataGridView> list = new List<DataGridView>();

     

                for (int i = 0; i < month; i++)

                {

                    int dayNum = DateTime.DaysInMonth(year, i+1);

                    DataGridView dgvn = new DataGridView();

                    dgvn.ColumnHeadersHeight = 40;

                    dgvn.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

                    dgvn.Dock = DockStyle.Top;

                    dgvn.Height = dayNum*20+70;

     

     

                    foreach (DataGridViewTextBoxColumn dgvc in dataGridView1.Columns)

                    {

                        DataGridViewTextBoxColumn dgvcNew = new DataGridViewTextBoxColumn();

                        dgvcNew.DataPropertyName = dgvc.DataPropertyName;

                        dgvcNew.HeaderText = dgvc.HeaderText;

                        dgvn.Columns.Add(dgvcNew);

                    }

                    list.Add(dgvn);

                }

     

                //循环添加到Panel中去

                for (int i = list.Count; i > 0; i--)

                {

                    //获取对应的要添加的DataGridView

                    DataGridView dgvn = list[i-1];

     

                    int dayNum = DateTime.DaysInMonth(year, i);

     

                    //dgvn = DBGV(dayNum, dgvn);

     

                    for (int numTemp = 0; numTemp < dayNum; numTemp++)

                    {

                        dgvn.Rows.Add(1);

                        dgvn.Rows[numTemp].Cells[0].Value = numTemp+1;

                        dgvn.Rows[numTemp].Cells[1].Value = i * 10;

                        dgvn.Rows[numTemp].Cells[2].Value = (i * 10).ToString() + "年";

                        dgvn.Rows[numTemp].Cells[3].Value = (i * 10).ToString() + "W";   

                    }

     

                    Label lb = new Label();

                    lb.Height = 15;

                    lb.Dock = DockStyle.Top;

                    lb.Text = (i).ToString()+"月份";

                    this.panel1.Controls.Add(lb);

                    this.panel1.Controls.Add(dgvn);

                }

            }

     

    而这段代码与上面几乎一样

    • 已标记为答案 天驰 2010年10月18日 1:30
    2010年9月28日 8:21
  • 两段几乎一样的代码,而得到的结果却是不同的,很疑问
    2010年9月28日 8:23
  • 问题已经自己解决了。

    2010年10月18日 1:31