当前位置:编程学习 > C#/ASP.NET >>

自定义组件--动态创建的控件无法正常显示

想自己写一个gridview组件,逻辑是从其它语言搬过来修改的
改好后编译正常,运行后却只能看到第一个子元件,
其它都看不到,也没报错
断点了各子元件创建也正常,赋值也都有执行,但就是无法正常显示,
哪位朋友有空帮忙看下什么原因

启动界面
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SalesManage.UI;
using System.Collections;

namespace SalesManage
{
    public partial class fertilizerType : Form
    {
        public fertilizerType()
        {
            InitializeComponent();
        }

        private void fertilizerType_Load(object sender, EventArgs e)
        {

            PQGrid g = new PQGrid(4,4,30, 30);//创建组件
            ArrayList al = new ArrayList();
            for (int i = 0; i < 20; i++)
            {//创建模拟数据
                ArrayList a = new ArrayList();
                a.Add("aa"+i.ToString());
                a.Add("ab" + i.ToString());
                a.Add("ac" + i.ToString());
                a.Add("ad" + i.ToString());
                al.Add(a);
            }
            g.bindData(al, "SalesManage.UI.PQGItem");//绑定数据
            this.Controls.Add(g);//添加到窗口
        }
    }
}

自定义组件 gridview

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace SalesManage.UI
{
    public partial class PQGrid : UserControl
    {
        public int _rowNum;
        public int _columnNum;
        public string _direction = "v";
        private int _columnWidth;
        private int _rowHeight;
        private int _spaceV=5;
        private int _spaceH=5;
        private ArrayList _item = new ArrayList();
        private Point point = new Point();
        public PQGrid(int rowNum,int columnNum,int columnWidth, int rowHeight)
        {//设置组件行列数及单元格宽高
            InitializeComponent();
            _rowNum = rowNum;
            _columnNum = columnNum;
            _columnWidth = columnWidth;
            _rowHeight = rowHeight;
            Size s=new Size();
            s.Width=columnNum*columnWidth;
            s.Height=rowNum*rowHeight;
            this.Size = s;
        }
        public PQGrid(int rowNum,int columnNum,int cw, int rh,int spaceV,int spaceH)
        {
            InitializeComponent();
            _rowNum = rowNum;
            _columnNum = columnNum;
            _columnWidth = cw;
            _rowHeight = rh;
            _spaceH = spaceH;
            _spaceV = spaceV;
        }
        public void bindData(ArrayList al,string item)
        {//根据数据源动态创建子元件并排列
            int n = al.Count;
if(n<1)return;
int pNum = Convert.ToInt32(Math.Round(n / (_rowNum * _columnNum)+0.5));//计算页数
int itemNum = 0;
            Type type = Type.GetType(item);
for (int p = 0; p < pNum;p++){
for (int i = 0; i < _rowNum; i++) {
for (int j = 0; j < _columnNum;j++){
                        Object obj=Activator.CreateInstance(type);//创建子元件实例
point.X = j % _columnNum * (_columnWidth + _spaceH) + _spaceH;
point.Y = i * (_rowHeight + _spaceV) + _spaceV;
if (_direction == "v")point.Y += p * (_rowNum * (_rowHeight + _spaceV) + _spaceV);
else point.X += p * (_columnNum * (_columnWidth + _spaceH) + _spaceH);
                        ((Control)obj).Location=point;//设置坐标
this.Controls.Add((Control)obj);//添加子元件到组件上
                        ((IPQGItem)obj).bindData((ArrayList)al[itemNum]);//为子元件绑定数据
itemNum++;
if (itemNum > n - 1)return;
}
}
}
        }
    }
}



组件元件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace SalesManage.UI
{
    public partial class PQGItem : UserControl,IPQGItem
    {
        public PQGItem()
        {
            InitializeComponent();
        }


        public void bindData(ArrayList al)
        {
            Label tb = new Label();
            tb.Text = al[0].ToString();
            tb.BringToFront();
            this.Controls.Add(tb);
        }
    }
}

接口
using System.Collections;

namespace SalesManage.UI
{
    interface IPQGItem
    {
        void bindData(ArrayList al);
    }
    
}
--------------------编程问答--------------------
编译后结果只有一个,无法看到其它格子 --------------------编程问答--------------------                 a.Add("aa"+i.ToString());
                a.Add("ab" + i.ToString());
                a.Add("ac" + i.ToString());
                a.Add("ad" + i.ToString());
                al.Add(a);
这些类型都有么?


((IPQGItem)obj).bindData((ArrayList)al[itemNum]);//为子元件绑定数据
调用的是
            Label tb = new Label();
            tb.Text = al[0].ToString();
            tb.BringToFront();
            this.Controls.Add(tb);
那么位置有设置么? --------------------编程问答--------------------
引用 2 楼 devmiao 的回复:
                a.Add("aa"+i.ToString());
                a.Add("ab" + i.ToString());
                a.Add("ac" + i.ToString());
                a.Add("ad" + i.ToString());
                al.Add(a);
这些类型都有么?


((IPQGItem)obj).bindData((ArrayList)al[itemNum]);//为子元件绑定数据
调用的是
            Label tb = new Label();
            tb.Text = al[0].ToString();
            tb.BringToFront();
            this.Controls.Add(tb);
那么位置有设置么?

模拟数据都只是字符串而已,不需要其它处理
label位置没有设置,label本身添加到PQGItem中,一个PQGItem只有一个label
而PQGrid有对PQGItem位置进行设置了。 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,