读书人

数据表中记录为何会“隐身”?该如何解

发布时间: 2012-02-22 19:36:55 作者: rapoo

数据表中记录为何会“隐身”?
数据表中记录为何会“隐身”?

我在做一摇号系统。

有一功能:点击按钮,frmChild1上的Timer1启动,TextBox1便不停滚动显示数据表Person中的记录。

private void timer1_Tick(object sender, EventArgs e)
{
//获取Person表
DataTable myDT = this.dataDataSet1.Person;
//创建随机数
Random rnd = new Random();
//根据记录总数获取随机数
int i = rnd.Next(myDT.Rows.Count); //-------@@@@@@-------
//获取该行记录
DataRow dtRow = myDT.Rows[i];
//显示该行记录的编号
textBox1.Text = dtRow[ "编号 "].ToString();
}

如果在frmChild1上设一按钮来激活Timer,则程序运行正确:
private void btnCmd_Click(object sender, EventArgs e)
{
myTimer1.Enabled = true; //----------在这里激活Timer-----------
}

其中,myTimer1在frmChild类中定义如下:
public Timer myTimer1
{
get
{
return timer1;
}
}

然而,如果从另一窗体frmOutlookBar的按钮上激活frmChild1的Timer,则程序运行错误:
void OnOutlookBarItemClicked(OutlookBarBand band, OutlookBarItem item)
{
switch (item.Text)
{
case "开始 ":
frmChild1 myfrmChild1=GetfrmChild1();
myfrmChild1.myTimer1.Enabled = true; //----------在这里激活Timer-----------


break;
……
}
}

其中,在frmOutlookBar中通过静态变量法调用frmChild:
//定义被动窗体类型的静态私有成员属性
private static frmChild1 myfrmChild1 = null;
//定义被动窗体类型的私有成员方法
//作用:如果实例不存在(未初始化或已卸载)则创建并返回创建的实例,否则返回已有实例。
private frmChild1 GetfrmChild1()
{
if (myfrmChild1 == null || myfrmChild1.IsDisposed)
{
myfrmChild1 = new frmChild1();
}
return myfrmChild1;
}

事实上,调用窗体和激活Timer没出任何问题,同样能进入timer1_Tick事件,问题出在@@@@@@处(见第一段代码),运行到该语句时,系统报错:“在位置 0 处没有任何行。”

经调试发现,Count为0,奇怪的是myDT.Rows依旧正常,所以我的问题是“数据表中记录为何会“隐身”?”明明多窗体之间调用控件没有问题,成功激活Timer,那问题能出在哪儿呢?

需要说明的是,这两个窗体都为MDI子窗体,数据在设计frmChild1窗体时中便已加载,也就是说,在我通过两种不同途径激活Timer时,数据都在内存中是可用的。

[解决办法]
帮顶
[解决办法]
帮顶
[解决办法]
那你监视myDT.Rows[0]是多少?
[解决办法]
用事件吧。。。

[解决办法]
myDT.Rows是从0开始的,应该int i = rnd.Next(myDT.Rows.Count-1);
然后再DataRow dtRow = myDT.Rows[i];否则应该会数组越界吧??
个人意见,你试试……
[解决办法]
楼主,感觉你的问题出在GetfrmChild1()函数,有这可能这个函数执行了myfrmChild1 = new frmChild1();,使加载的数据实效了。

你这样试试获取frmChild1的实例呢。

class A

{

private static A _instance;
public A()
{
_instance = this; ----------#####这句话要放在frmChild1的所有构造函数中####--------
}

public static A Instance
{
get
{
return _instance;
}
}
}

你通过A.Instance.myTimer引用Timer。这样调用的前提是myfrmChild1窗体已呈现。如若没有呈现,也可以修改Instance属性。
public static A Instance
{
get
{
if(_instance==null)
(new A()).Show();

return _instance;
}
}
[解决办法]
没给你搞明白,嘿嘿。。
不过那样出随机数会出现越界的可能性的呢
[解决办法]
timer的时间隔是多少?

如果timer的时间隔小于100(0.1秒),刷新太快谁能看到啊??
而messagebox.Show()则暂停了线程的执行。。。

有或者
[解决办法]
frmChild1 myfrmChild1=GetfrmChild1();

myfrmChild1.show() ;//你还是显示看看



myfrmChild1.myTimer1.Enabled = true; //----------在这里激活Timer-----------

读书人网 >C#

热点推荐