2013-09-27 3 views
1

Я пытаюсь обновить datagridview с некоторыми данными, вычисленными в другом классе и потоке, с использованием делегата. К сожалению, у меня возникают проблемы с множеством различных ошибок, в зависимости от подхода, который я пытаюсь сделать.C# - Обновление GUI datagridview из другого потока с использованием делегата

кода Я пытаюсь выполнить в виде нити выглядит следующим образом:

public partial class AcquireForm : Form 
// 
// ... 
// 
    // update the grid with results 
    public delegate void delUpdateResultsGrid(int Index, Dictionary<string, double> scoreCard); 
    public void UpdateResultsGrid(int Index, Dictionary<string, double> scoreCard) 
    { 
     if (!this.InvokeRequired) 
     { 
      // 
      // Some code to sort the data from scoreCard goes here 
      // 

      DataGridViewRow myRow = dataGridViewResults.Rows[Index]; 
      DataGridViewCell myCell = myRow.Cells[1]; 
      myCell.Value = 1; // placeholder - the updated value goes here 
      } 
     } 
     else 
     { 
      this.BeginInvoke(new delUpdateResultsGrid(UpdateResultsGrid), new object[] { Index, scoreCard}); 
     } 
    } 

Теперь мне нужно получить этот метод для запуска из моего другого потока и класса. Я пробовал:

public class myOtherClass 
// 
// ... 
// 

    private void myOtherClassMethod(int myIndex) 
    { 
     // ... 
     AcquireForm.delUpdateResultsGrid updatedelegate = new AcquireForm.delUpdateResultsGrid(AcquireForm.UpdateResultsGrid); 
     updatedelegate(myIndex, myScoreCard); 
    } 

К сожалению, это дает «Ссылка на объект требуется для нестатическая поля, метода или свойства AcquireForm.UpdateResultsGrid (междунар, System.Collections.Generic.Dictionary)» ошибка. Я, кажется, не в состоянии ссылаться на метод UpdateResultsGrid на всех ...

Я заметил, что

public class myOtherClass 
// 
// ... 
// 

    private void myOtherClassMethod(int myIndex) 
    { 
     // ... 
     AcquireForm acquireForm = new AcquireForm(); 
     acquireForm.UpdateResultsGrid(myIndex,myScoreCard); 
    } 

не бросает какие-либо ошибки при компиляции, но он пытается создать новую форму, и это что-то Я не хочу этого делать. Я не хочу создавать новый экземпляр AcquireForm, я хочу ссылаться на ранее существовавший, если это возможно.

Я также попытался сделать метод UpdateResultsGrid статическим, но это вызывает проблемы с несколькими вещами, включая использование этого «(ничего»).

Я также попытался переместить большинство метода UpdateResultsGrid в myOtherClassMethod, оставив в классе AcquireForm только делегат. Опять же, это не работает, потому что многие ссылки на объекты пользовательского интерфейса ломаются (в сфере видимости нет никаких данных).

Здесь у меня заканчиваются идеи. К сожалению, я довольно новичок в C# (как вы, вероятно, можете сказать), и я редактирую чей-то код вместо того, чтобы писать полностью с нуля. Если бы кто-нибудь мог предложить некоторые советы по этой проблеме, это было бы очень полезно.

ответ

0

Убедитесь, что объектов общаются друг с другом: Ваш myOtherClass собирается должен знать об объекте AcquireForm - вы не можете просто создать новую (как вы обнаружили). Вам нужно будет передать объект AcquireForm в myOtherClass объект (myOtherObject.SetForm (myAcquireForm, например) и ссылаться на него, когда вам нужно.

В случае, если вы возникли проблемы с вызовом этой мощью оказать помощь - как я вызвать «следующую» кнопку нажмите:

BeginInvoke(new Action(()=>button_next_Click(null,null))); 

Кроме того, это звучит, как, возможно, это не должны быть отдельные классы, и вы должны быть с использованием BackgroundWorkder вместо

+0

Привет noelicus, большое спасибо. за то, что нашли время, чтобы помочь меня с этим. Сможете ли вы немного разработать? Я попытался добавить строку: [code] myOtherClass.SetForm (AcquireForm); [/ code] , но это не сработало - SetForm, похоже, не признано действительным определением. Я согласен с тем, что мне нужно, чтобы myOtherClass распознал объект AcquireForm, но могли бы вы дать еще несколько советов о том, как это сделать? – user2823789

+0

Вам нужно убедиться, что вы * объекты * общаетесь - то, что вы набрали, подразумевает, что вам может быть полезно прочитать разницу между классом и объектом. Кроме того, я бы рекомендовал попытаться сделать то, что у вас есть на одном классе, из того, что вы сказали, - тогда эти проблемы исчезнут. – noelicus

+0

Хорошо, я думаю, что я взломал его. Я добавил поле в конструктор для myOtherClass типа AcquireForm, а затем использовал «this» при создании экземпляра класса из AcquireForm. Кажется, что сейчас это работает без ошибок, но я буду рассматривать слияние классов, когда у меня будет немного больше времени на это. Большое спасибо за ваш совет! – user2823789

Смежные вопросы