Я пытаюсь обновить 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# (как вы, вероятно, можете сказать), и я редактирую чей-то код вместо того, чтобы писать полностью с нуля. Если бы кто-нибудь мог предложить некоторые советы по этой проблеме, это было бы очень полезно.
Привет noelicus, большое спасибо. за то, что нашли время, чтобы помочь меня с этим. Сможете ли вы немного разработать? Я попытался добавить строку: [code] myOtherClass.SetForm (AcquireForm); [/ code] , но это не сработало - SetForm, похоже, не признано действительным определением. Я согласен с тем, что мне нужно, чтобы myOtherClass распознал объект AcquireForm, но могли бы вы дать еще несколько советов о том, как это сделать? – user2823789
Вам нужно убедиться, что вы * объекты * общаетесь - то, что вы набрали, подразумевает, что вам может быть полезно прочитать разницу между классом и объектом. Кроме того, я бы рекомендовал попытаться сделать то, что у вас есть на одном классе, из того, что вы сказали, - тогда эти проблемы исчезнут. – noelicus
Хорошо, я думаю, что я взломал его. Я добавил поле в конструктор для myOtherClass типа AcquireForm, а затем использовал «this» при создании экземпляра класса из AcquireForm. Кажется, что сейчас это работает без ошибок, но я буду рассматривать слияние классов, когда у меня будет немного больше времени на это. Большое спасибо за ваш совет! – user2823789