数据表中记录为何会“隐身”?我在做一摇号系统。有一功能:点击按钮,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时,数据都在内存中是可用的。

解决方案 »

  1.   

    dataDataSet1在哪初始化的
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  2.   

    myDT.Rows是从0开始的,应该int i = rnd.Next(myDT.Rows.Count-1);
    然后再DataRow dtRow = myDT.Rows[i];否则应该会数组越界吧??
    个人意见,你试试……
      

  3.   

    楼主,感觉你的问题出在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;
    }
    }
      

  4.   

    楼主的问题是出在这个函数。myfrmChild1没有初始化,所以每次都要new,new了以后又没有呈现,所以你得到的变量并不是指向当前显示的frmChild1窗体的。
    private frmChild1 GetfrmChild1()
    {
    if (myfrmChild1 == null || myfrmChild1.IsDisposed)
    {
    myfrmChild1 = new frmChild1();
    }
    return myfrmChild1;
    }
      

  5.   

    情况有变:原来
    this.personTableAdapter.Fill(this.dataDataSet1.Person)
    语句在frmChild1_Load中,当我把该语句转移到frmChild1的构造函数中时,上述问题得以解决,系统不再报错,可是
    textBox1.Text = dtRow["编号"].ToString();
    却并没有好好执行,textBox1中什么内容都没有。我在这个语句下加了句
    textBox1.Refresh();
    MessageBox1.Show(textBox1.Text);
    结果MessageBox中内容正常,textBox1中还是没有内容,明明textBox1.Text有值,窗体上却没显示,咋回事?
    我尝试着把TextBox1做成公有变量myTextBox1,还是没用。
      

  6.   

    to:tesling(我的梦想是~~~~~变成一头永远长不肥的猪!) 
    您说的我程序中有。to:feiyun0112(http://feiyun0112.cnblogs.com/) 
    您说的对!但不明白为何在Form_Load中初始化同在构造函数中初始化有差别
      

  7.   

    case "开始":
                        frmChild1 myfrmChild1=GetfrmChild1();myfrmChild1.show() ;//你窗体在哪显示的?                    myfrmChild1.myTimer1.Enabled = true;    //----------在这里激活Timer-----------
                        break;
      

  8.   

    to:tesling(我的梦想是~~~~~变成一头永远长不肥的猪!)
    好像不管用呵,还是谢谢!肯定给您分。
    搞定就散分呵。
      

  9.   

    两个窗体都是启动时就显示的用的是GetfrmChild1?
      

  10.   

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

  11.   

    to:feiyun0112(http://feiyun0112.cnblogs.com/) 
    在frmOutlookbar_Load中使用了
    frmChild1 myfrmChild1=GetfrmChild1();
    我在GetfrmChild1()的
    myfrmChild1 = new frmChild1();
    加了断点,发现该语句在点击按钮时并没有执行,说明确实是调用已有的窗体呀。
    to:Silicon_Fado(俩醒叁醉)
    早就改成1000了。确实不显示。
      

  12.   

    frmChild1 myfrmChild1=GetfrmChild1();myfrmChild1.show() ;//你还是显示看看                    myfrmChild1.myTimer1.Enabled = true;    //----------在这里激活Timer-----------
      

  13.   

    to:feiyun0112(http://feiyun0112.cnblogs.com/) 您强!果然不出您的所料,弹出个新窗体!
    可是myfrmChild1 = new frmChild1();并没执行啊。
      

  14.   

    你看一下你第一个frmChild1.show到底怎么调的