Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
11 / 11 / 8
Регистрация: 08.10.2013
Сообщений: 51
1

Обновление данных dataGridView в потоке ошибка BindingSource не может быть источником данных для самого себя

24.10.2015, 18:00. Просмотров 2886. Ответов 2
Метки нет (Все метки)


Изучаю потихоньку C#, требуется в отдельном потоке обновлять данные dataGridView. Если не выбирать ячейку или не прокручивать полосу прокрутки, то все работает нормально, иначе появляется эта ошибка :
"Исключение в DataGidView
System.InvalidOperationException : DindingSource не может быть источником данных для самого себя. Для свойств DataSource и DataMember нельзя установить значения, ссылающиеся на BindingSource."
Вот листинг:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        bool work = true;
        BindingSource bS = new BindingSource();
        DataTable dT = new DataTable("Def");
        Thread thr=null;
 
        private void thrPr()
        {
            Random ran=new Random();
            while (work)
            {
                lock (dataGridView1)
                {
                    foreach (DataRow r in dT.Select())
                    {
                        r.BeginEdit();
                        r["nom"] = Convert.ToString(ran.Next(0,100));
                        r.EndEdit();
 
                    }
                }
                Thread.Sleep(1000);
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            dT.Columns.Add("Id", typeof(Int32));
            dT.Columns.Add("nom", typeof(String));
            dT.Columns["Id"].AutoIncrement = true;
            for(int i=10;i<110000;i++)
            {
                DataRow r = dT.NewRow();
                r["nom"] = Convert.ToString(i);
                dT.Rows.Add(r);
            }
            dataGridView1.DataSource = bS;
            bS.DataSource = dT;
            thr = new Thread(thrPr);
            thr.IsBackground = true;
            thr.Start();
 
        }
    }
}

Подскажите что делаю не так.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2015, 18:00
Ответы с готовыми решениями:

bindingsource не может быть источником данных для самого себя
Здравствуйте друзья. Я цыклом пропинговываю ip адреса, беру ip из базы (access). Выскакивают...

Обновление datagridview - актуализация с источником данных в реальном времени
Много пересмотрел в интернете и тем на этом форуме,но так и не разобрался. В приложении есть...

Может ли быть ошибка при передаче данных?
есть функция: CalculateMovingAverage(&amp;RMSSmoothLenghtM1, URMS.Channel1M, URMSSmooth.Channel1M); ...

В чем может быть ошибка? Почему отображается пустая страница, вместо данных?
В чем может быть ошибка? Почему отображается пустая страница, вместо данных? И может кто...

2
Эксперт .NETАвтор FAQ
9834 / 4794 / 1725
Регистрация: 11.01.2015
Сообщений: 5,973
Записей в блоге: 34
24.10.2015, 21:54 2
Serho88, К контролам можно обращаться только из главного потока. У вас выскакивает ошибка из-за того, что вы обновляете ваш DataTable из другого потока, а он вызывает события обновления DataGridView и все это происходит не в главном потоке.
Для вызова кода в главном потоке - используйте метод Invoke. Вот так будет работать:

C#
1
2
3
r["nom"] = Convert.ToString(ran.Next(0,100));
===>
Invoke((MethodInvoker) delegate { r["nom"] = Convert.ToString(ran.Next(0, 100)); } );
Правда тогда и смысл отдельного потока теряется

И еще, методы BeginEdit и EndEdit - вызывать не нужно, они совершенно для другого.
И lock - тоже не имеет смысла в данном случае.
1
11 / 11 / 8
Регистрация: 08.10.2013
Сообщений: 51
25.10.2015, 05:13  [ТС] 3
Спасибо за объяснения. Помогло.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2015, 05:13

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Странная ошибка с ODBC: [Microsoft][Драйвер ODBC Microsoft Access] Файл '(нет данных)' не может быть открыт ядром базы данных Microsoft Jet.
Внезапно вылезла вот такая ошибка: Файл '(нет данных)' не может быть открыт ядром базы данных...

Программа не доходит до процедуры ClrAll при правильном вводе данных. В чём может быть ошибка?
Программа не доходит до процедуры ClrAll при правильном вводе данных. В чём может быть ошибка?uses...

Обновление DataGridView для отображения данных из нового DataTable
Доброго времени суток. У меня проблема с DataGridView. Вообщем есть БД Access. Я из этой бд...

Может ли быть одинаковая хэш-сумма для разных наборов данных?
Всем привет! Есть небольшая серия вопросов по хэшам, к ому не сложно, дайте свои комменты по...

Ошибка Файл не может быть открыт ядром базы данных microsoft jet. Файл уже открыт другим пользователем для монопольного доступа или
После написания программы, записал исходник на диск. При запуске экзешника с диска появляется такая...

Обновление базы и ошибка: Обновление невозможно. База данных или объект доступны только для чтения.
Помогите пожалуйста! asp не может обновить базу. Про ошибку говорит Microsoft OLE DB Provider for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.