Поле списка Winforms, не обновляющее, когда связанные данные изменяются

Это дает вам то, что вы хотите, учитывая ввод:

a[0].split('"')[1].replace(",", "#")

Но что-то подсказывает мне, что это не слишком полезно / общее.

Но, в любом случае, решение проблемы такого рода, вероятно, будет включать следующие два метода строки / списка: split и replace

https://docs.python.org/3/ library / stdtypes.html # str.split

https://docs.python.org/3/library/stdtypes.html#str.replace

[1113 ] update

Итак, если вам нужно использовать RDD-искру, вы можете сначала создать RDD, используя список строк (еще не CSV-файл)

>>> rdd = sc.parallelize(a)
>>> rdd.take(1)
['0,Italy,"Aromas include tropical fruit, broom, brimstone and dried herb. The palate isnt overly expressive, offering unripened apple, citrus and dried sage alongside brisk acidity.",Vulk\xc3\xa0 Bianco,87,,Sicily & Sardinia,Etna,,Kerin O\xe2\x80\x99Keefe,@kerinokeefe,Nicosia 2013 Vulk\xc3\xa0 Bianco (Etna),White Blend,Nicosia']
>>> processed_rdd = rdd.map(lambda row: row.split('"')[0] + row.split('"')[1].replace(",", "#") + row.split('"')[2])
>>> processed_rdd.take(1)
['0,Italy,Aromas include tropical fruit# broom# brimstone and dried herb. The palate isnt overly expressive# offering unripened apple# citrus and dried sage alongside brisk acidity.,Vulk\xc3\xa0 Bianco,87,,Sicily & Sardinia,Etna,,Kerin O\xe2\x80\x99Keefe,@kerinokeefe,Nicosia 2013 Vulk\xc3\xa0 Bianco (Etna),White Blend,Nicosia']

Есть несколько предположения Я делаю, потому что вы предоставили только один пример строки.

Эти предположения касаются существования этой строки в двойных кавычках " ", которая является столбцом с запятыми, нуждающимися в замене.

Далее, я предполагаю, что " нет ни в одном из других столбцов.

Я также предполагаю, что этот столбец не нуждается в тех " после обработки.

Объяснение

Метод rdd map отобразит функцию на каждую строку в СДР, а лямбда, которую принимает map, возвращает новую строку. Итак, здесь я отображаю эту замещающую цепочку команд для каждой строки в СДР (а затем в примере я take один)

5
задан Glorfindel 11 March 2019 в 17:01
поделиться

2 ответа

Я предполагаю, что это связано с тем, что сообщение об обновлении обрабатывается не в том потоке. Фон: каждый поток имеет свою очередь сообщений. Сообщения, помещенные в очередь сообщений, будут по умолчанию помещаться в ту же ветку, что и вызывающая сторона. Поэтому обратный вызов может публиковать сообщение не в том потоке.

Попробуйте это: переместите метод AddNumber () в форму и используйте Invoke () (унаследованный Control), чтобы добавить элемент в правильный поток. Это может избавить от проблемы.

Отредактируйте , чтобы отразить ваши действия: The UI doesn't have to know about your component. What you need is just a proper synchronization between adding the item to your list and the UI, since UI updates will oly work if the thread matches. Therefore, you might want to supply the Control to your class which wraps the BindingList, and then do the Invoke on the list itself. This makes the list worry about triggering the upate on the UI thread and does take the worry from both the UI and the external component of invoking the handler on the correct thread.

Like this:

internal class ListBoxDataBindingSource {
  private readonly Control uiInvokeControl;
  private readonly BindingList<Item> list = new BindingList<Item>();

    public ListBoxDataBindingSource(Control uiInvokeControl) {
      if (uiInvokeControl == null) {
            throw new ArgumentNullException("uiInvokeControl");
      }
        this.uiInvokeControl = uiInvokeControl;
        CDIIWrapper.setFP(AddNumber);
    }

    public void AddNumber(int num) {
      Item item = new Item(num.ToString());
        if (uiInvokeControl.InvokeRequired) {
            uiInvokeControl.Invoke(list.Add, item);
        } else {
            list.Add(item);
        }
    }

    private BindingList<Item> List {
        get {
            return list;
        }
    }
}
2
ответ дан 15 December 2019 в 06:35
поделиться

Вместо того, чтобы setFP установил обратный вызов в lbDataBindingSource.AddNumber, создайте частный метод в своем коде для обработки обратного вызова и затем вызовите lbDataBindingSource.AddNumber из этого обратного вызова.

void MyForm_Load(object sender, EventArgs e)
{
    //...

    cdll.setFP(FPCallback);
}

private void FPCallback(int num)
{
    lbDataBindingSoruce.AddNumber(num);
}
0
ответ дан 15 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

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