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

phhui 2013-10-10 06:06:22
想自己写一个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);
}

}
...全文
104 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
phhui 2013-10-11
  • 打赏
  • 举报
回复
phhui 2013-10-10
  • 打赏
  • 举报
回复
引用 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位置进行设置了。
devmiao 2013-10-10
  • 打赏
  • 举报
回复
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); 那么位置有设置么?
phhui 2013-10-10
  • 打赏
  • 举报
回复

编译后结果只有一个,无法看到其它格子

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧