首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-02-22 
数据表中记录为何会“隐身”?数据表中记录为何会“隐身”?我在做一摇号系统。有一功能:点击按钮,frmChild1上的T

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

我在做一摇号系统。

有一功能:点击按钮,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-----------

热点排行