Странное свинчивание резьбы ошибки UI

IIUC вам нужно:

df.merge(df.groupby('id')['c1'].apply(lambda x : x.max()).reset_index().rename(columns={'c1':'c1_secondLargest'}),on='id')

или:

print(df.merge(df.groupby('id')['c1'].apply(lambda x : x.nlargest(1)).reset_index().rename(columns={'c1':'c1_secondLargest'}).drop('level_1',axis=1),on='id'))


   id  c1  c1_secondLargest
0   1   3                75
1   1  34                75
2   1  75                75
3   2  84                96
4   2  54                96
5   2  23                96
6   2  96                96
7   3  55                76
8   3  76                76
6
задан Unsliced 14 October 2008 в 08:18
поделиться

5 ответов

Так как Вы делаете привязку UI через подписку события, Вы могли бы найти это полезным; это - пример, я записал только что, что шоу, как разделить на подклассы BindingList<T> так, чтобы уведомления были упорядочены к потоку UI автоматически.

Если нет никакого синхронизирующего контекста (т.е. консольный режим), то он возвращается назад к простому прямому, вызывают, таким образом, нет никаких издержек. При выполнении в потоке UI обратите внимание, что это по существу использует Control.Invoke, который самостоятельно просто выполняет делегата непосредственно, если это находится на потоке UI. Таким образом, существует только любой переключатель, если данные редактируются от потока неUI - выступы, что мы хотим;-p

3
ответ дан 17 December 2019 в 00:16
поделиться

Вы ответили на свой собственный quesion:-

Я получаю ошибку при высказывании, что к DataGridView получали доступ от потока кроме потока, на котором он был создан.

WinForms настаивает, что все действия, выполненные на формах и средствах управления, сделаны в контексте потока, в котором была создана форма. Причина этого сложна, но имеет непосредственное отношение к базовому Win32 API. Для получения дополнительной информации посмотрите различные записи на Старой Новой Вещи блог.

То, что необходимо сделать, использовать InvokeRequired и Вызвать методы, чтобы гарантировать, что к средствам управления всегда получают доступ от того же потока (pseudocodeish):

object Form.SomeFunction (args)
{
  if (InvokeRequired)
  {
    return Invoke (new delegate (Form.Somefunction), args);
  }
  else
  {
    return result_of_some_action;
  }
}
4
ответ дан 17 December 2019 в 00:16
поделиться

У меня была эта та же проблема прежде. Возможно, эта статья, которую я отправил об этом, может помочь.

http://cyberkruz.vox.com/library/post/net-problem-async-and-windows-forms.html

0
ответ дан 17 December 2019 в 00:16
поделиться

Я нашел эту статью - "Обновление IBindingList от другого потока" - который обвинил вины BindingList -

Поскольку BindingList не является установкой для асинхронных операций, необходимо обновить BindingList от того же потока, на котором им управляли.

Явно передавая родительскую форму как ISynchronizeInvoke объект и создание обертки для BindingList<T> добился цели.

0
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: