是这样的,一个form上面有一个dataGridView和32个button,我想在dataGridView显示数据之后,把32个按钮都放到dataGridView最右边的4*8个cell里面,都是奇怪的是,按照下面的代码,按钮的位置是改变了。但是中间有一部分按钮不显示在dataGridView上面,奇怪望解答。。
每个按钮都调用了。位置也改变了。。我调试,位置也是显示在对应的cell上,按钮visible也是true,但是就是中间一些显示不了。。
不明白个中原理,期待解答        private void ShowButtonOnDataGridView()//显示按钮到dataGridView1
        {
            int max = dataGridView1.ColumnCount;
            for (int i = 0; i < dataGridView1.Rows.Count; i++)
            {
                SetButton((Button)Controls["button0" + (i + 1).ToString() + "1"], i, max - 4);
                SetButton((Button)Controls["button0" + (i + 1).ToString() + "2"], i, max - 3);
                SetButton((Button)Controls["button1" + (i + 1).ToString() + "1"], i, max - 2);
                SetButton((Button)Controls["button1" + (i + 1).ToString() + "2"], i, max - 1);
            }
        }
        private void SetButton(Button bt,int row_index,int col_index)
        {
            Rectangle rect = dataGridView1.GetCellDisplayRectangle(col_index,row_index , false);
            bt.Left = rect.Left + dataGridView1.Left+groupBox1.Left;
            bt.Top = rect.Top + dataGridView1.Top+groupBox1.Top;
            bt.Width = rect.Width;
            bt.Height = rect.Height;
            bt.Visible = true;
        }

解决方案 »

  1.   

    groupBox1.left,groupBox1.Top?What?
      

  2.   

    如果32个按钮都是在设计时生成的,那就需要确认两件事:
    1、所有的按钮都在同一个父控件里面。
    2、所有的按钮应该都显示在DataGridView前面。可以在设计器里对所有的按钮进行“置于顶端”的操作。不过我不明白的是,为什么要用这种方法为每行加按钮啊,多累,为什么不直接用按钮列呢?
    System.Windows.FormsDataGridViewButtonColumn
    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewbuttoncolumn(v=vs.80).aspx
      

  3.   

    建议用一个panel把这32个按钮包起来,整体操作
      

  4.   

    调试的时候加进去了啊,
    运行时就没了啊-----------------------
    刷新界面啊refresh();
      

  5.   

    winform ? 不是我的领域啊!
      

  6.   

    大哥们起床第一件事是上CSDN看代码啊
      

  7.   

    ShowButtonOnDataGridView什么时候调用可能是dataGridView控件本身的问题,没有加载行就已经调用ShowButtonOnDataGridView方法了如果是中间那几行,4个按钮都不显示,就应该是这个问题
      

  8.   

    我自己试了一下,你得代码应该没啥问题,我的代码略有小改动,button从button3到button34,你要确保这些button要在datagridview之前加入到form控件列表中,否则它会被datagridview遮盖,你看不见private void button2_Click(object sender, EventArgs e)
            {
                List<FillData> lstFillData = new List<FillData>(8);            for (int nI = 0; nI < 8; nI++)
                {
                    FillData fd = new FillData();
                    fd.Text = nI.ToString();
                    fd.A1 = "";
                    fd.A2 = "";
                    fd.A3 = "";
                    fd.A4 = "";                lstFillData.Add(fd);
                }            dataGridView1.DataSource = lstFillData;
                dataGridView1.Update();            ShowButtonOnDataGridView();
            }        private void ShowButtonOnDataGridView()//显示按钮到dataGridView1
            {
                int max = dataGridView1.ColumnCount;            int index = 3;
                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                    SetButton((Button)Controls["button" + (index++).ToString()], i, max - 4);
                    SetButton((Button)Controls["button" + (index++).ToString()], i, max - 3);
                    SetButton((Button)Controls["button" + (index++).ToString()], i, max - 2);
                    SetButton((Button)Controls["button" + (index++).ToString()], i, max - 1);
                }
            }
            private void SetButton(Button bt, int row_index, int col_index)
            {
                Rectangle rect = dataGridView1.GetCellDisplayRectangle(col_index, row_index, false);
                bt.Left = rect.Left + dataGridView1.Left;
                bt.Top = rect.Top + dataGridView1.Top;
                bt.Width = rect.Width;
                bt.Height = rect.Height;
                bt.Visible = true;
            }public class FillData
        {
            private string text;        public string Text
            {
                get { return text; }
                set { text = value; }
            }        private string a1;        public string A1
            {
                get { return a1; }
                set { a1 = value; }
            }        private string a2;        public string A2
            {
                get { return a2; }
                set { a2 = value; }
            }        private string a3;        public string A3
            {
                get { return a3; }
                set { a3 = value; }
            }        private string a4;        public string A4
            {
                get { return a4; }
                set { a4 = value; }
            }
        }
      

  9.   


    //没试出有什么奇怪  测试的是把四个按钮移到第一行的四列上  
    private void btnRemove_Click(object sender, EventArgs e)
            {
                //假设行高列宽都相等  则共用
                Int32 height = dataGridView1.Rows[0].Height;
                Int32 width = dataGridView1.Columns[0].Width;            if(dataGridView1.Rows.Count>0)
                {
                    Int32 top = dataGridView1.Top + dataGridView1.ColumnHeadersHeight;
                    Int32 left = dataGridView1.Left + dataGridView1.RowHeadersWidth;
                    for (int i = 0; i < 4; i++)
                    {          
                        Button btn = (Button)this.Controls["button" + (i+1).ToString()];
                        if (i <= 0)
                        {
                            btn.Left = left;
                            btn.Width = width;
                            btn.Top = top;
                            btn.Height = height;                    }
                        else
                        {
                            
                            btn.Left = left + i*width;
                            btn.Width = width;
                            btn.Top = top;
                            btn.Height = height;
                        }
                        
                        
                    }
                }
            }
      

  10.   

    //把四个按钮移到 第一行的四列 
    private void btnRemove_Click(object sender, EventArgs e)
            {
                //假设函告列宽都相等  则共用
                Int32 height = dataGridView1.Rows[0].Height;
                Int32 width = dataGridView1.Columns[0].Width;            if(dataGridView1.Rows.Count>0)
                {
                    Int32 top = dataGridView1.Top + dataGridView1.ColumnHeadersHeight;
                    Int32 left = dataGridView1.Left + dataGridView1.RowHeadersWidth;
                    for (int i = 0; i < 4; i++)
                    {          
                        Button btn = (Button)this.Controls["button" + (i+1).ToString()];
                        if (i <= 0)
                        {
                            btn.Left = left;
                            btn.Width = width;
                            btn.Top = top;
                            btn.Height = height;                    }
                        else
                        {
                            
                            btn.Left = left + i*width;
                            btn.Width = width;
                            btn.Top = top;
                            btn.Height = height;
                        }
                        
                        
                    }
                }
            }
      

  11.   

    Pannel  这个容器对于布局 很有用的。