none
为什么用dr.BeginEdit();也会出现“索引超出范围”的提示 RRS feed

  • 问题

  • 如题,我在DataRow dr = table.Rows[1];
    dr.BeginEdit();
    就会出现这种错误。。。。
    我的table是初始化两行都是0了。
    • 已移动 Sheng Jiang 蒋晟Moderator 2009年11月24日 15:09 System.Data问题 (发件人:.NET Framework 一般性问题讨论区)
    2009年11月24日 6:03

全部回复

  • 你好!

    可能是其它原因所致,代码太少也看不出问题,你可以帖出更详细的代码,以便讨论。

    另外你可以使用下面的方法试试。

    if (table.Rows.Count > 2)
    {
        DataRow dr = table.Rows[1];
        dr.BeginEdit();
    }

    知识改变命运,奋斗成就人生!
    2009年11月24日 6:50
    版主
  • 你好!
         你输出一下table.Rows.Count,看看到底有几行!这样可以看你的索引是否超出范围!
    周雪峰
    2009年11月24日 8:46
    版主
  • 你的table 有两行数据吗?
    应该是你的table只有一行或者没有数据
    如果只有一行 那么需要这样 索引是从0开始的
    DataRow dr = table.Rows[0];
    dr.BeginEdit();
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!My blog~~~
    2009年11月25日 1:35
    版主
  • 出错的时候。我在即时窗口输出这个dr
    结果:
    dr.ItemArray
    {object[18]}
        [0]: "0"
        [1]: "0"
        [2]: {}
        [3]: 0.0
        [4]: 0.0
        [5]: 0.0
        [6]: 0.0
        [7]: 0.0
        [8]: 21.0
        [9]: 0.0
        [10]: 21.0
        [11]: 0.0
        [12]: 0.0
        [13]: 0.0
        [14]: 0.0
        [15]: 0.0
        [16]: 0.0
        [17]: 0.0

    是有值的啊……

    我想是不是多线程的原因呢。我的table初始化两行18列后,就不会进行任何的删除操作,只是改变它的值。所以我 很奇怪为什么会出现这种错误。而且并不是一运行程序就出错,而是不定时的出现。

    我这里有多个timer,会去读写取同一个表格的不同行,会不会是因为这个原因呢?两个timer同时处理一个table导致的呢?

    timer1的触发函数:
    testFunction(1);

    timer2的触发函数:
    testFunction(2);

    他们都调用同一个函数,只是参数不一样。

    public void testFunction(int index)
    {
            DataRow dr = table.Rows[index];
                if(条件满足)
                     dr[0] = (float)dr[0] + 1.0f;
    }
    也就是在timer里,满足条件,则表格的index行的第一列增加1.
    2009年11月25日 6:41
  • 你好!
         根据你的描述,我认为很可能是多线程引起的,你检查代码的相关方面吧!很可能由于同步等原因而导致数据行没有添加成!
    周雪峰
    2009年11月25日 6:48
    版主
  • 谢谢版主~~

    但是我奇怪的是,我的table的构造是放在初始化代码的,程序一运行就已经将table构造为两行18列了。

    我在timer里只是对它进行值的改变,并没有对它进行增加或者减少行的做法……

    2009年11月25日 7:00
  • 虽然你没有减少,但也有可能你当前访问的索引在你预期的时间内还未添加上。在修改的地方判断索引是否存在,加上 lock 语句试试。
    知识改变命运,奋斗成就人生!
    2009年11月25日 7:07
    版主
  • 我的table的构造,是在窗口的构造函数里就完成了。也就是如果窗口显示的时候,数据构造的代码是肯定完成了的。

    我估计可能如周雪峰版主所说的 多线程的原因。可能是:

    “多个线程可能会试图同时访问某个对象。在多个线程同时争相访问某个对象的同时,如果一个线程修改了资源,有些线程可能会收到无效状态。”

    可能是我别的线程在修改table中的第一行的时候,我第二个线程从table中读取第二行DataRow dr = table.Rows[1];时,table就是无效的返回null了。
    public void testFunction(int index)
    {
            DataRow dr = table.Rows[index];
                if(条件满足)
                     dr[0] = (float)dr[0] + 1.0f;
    }

    会不会是这样呢?
    2009年11月26日 4:46