Привязка элемента управления к объекту против DataRow

Для бэкэнда MySQLdb я изменил внушительный ответ Альбертова (спасибо большое!). Я уверен, что они могут быть объединены, чтобы проверить, было ли comp.positional True, но это немного выходит за рамки этого вопроса.

def compile_query(query):
    from sqlalchemy.sql import compiler
    from MySQLdb.converters import conversions, escape

    dialect = query.session.bind.dialect
    statement = query.statement
    comp = compiler.SQLCompiler(dialect, statement)
    comp.compile()
    enc = dialect.encoding
    params = []
    for k in comp.positiontup:
        v = comp.params[k]
        if isinstance(v, unicode):
            v = v.encode(enc)
        params.append( escape(v, conversions) )
    return (comp.string.encode(enc) % tuple(params)).decode(enc)
0
задан Matanya Cohen 18 January 2019 в 10:43
поделиться

2 ответа

Почему привязка TextBox не работает правильно в первом примере?

Это потому, что TypeDescriptor из DataRow не имеет свойства Id. Рассмотрим следующие правила:

  • Когда привязка данных к свойству элемента, дескриптор типа элемента должен содержать свойство с таким именем.

  • При привязке данных к списку дескриптор типа элемента списка должен содержать свойство с таким именем.

Верно ли говорить, что автоматическое (без какого-либо дополнительного вызова для связывания do) распространение из источника в управление происходит только с DataRow?

Нет. Это не из-за типа DataRow. Это из-за INotifyPropertyChanged и IBindingList. Рассмотрим следующие правила:

  • Когда данные связывают элемент управления с элементом, если элемент реализует INotifyPropertyChanged, пользовательский интерфейс будет обновляться сразу после обновления элемента.

  • При привязке данных к элементу управления списком, если элемент реализует INotifyPropertyChanged и список реализует IBindingList, пользовательский интерфейс будет обновляться сразу после обновления элемента или списка.

Дополнительная информация

Коротко о том, что я описал выше, вы можете найти в Привязка данных Windows Forms . Я рекомендую прочитать следующие полезные документы:

0
ответ дан Reza Aghaei 18 January 2019 в 10:43
поделиться

Так как, может быть, описание этой процедуры в комментариях не очень хорошая идея, вот расширенная версия .

Вот что происходит, используя код, показанный здесь:

DataBindings BindingSource [1124]

<час>

Примечание :
Я использую лямбду здесь, чтобы подписаться на событие Parse ; Вы можете захотеть использовать отдельный обработчик, если вам нужно подписаться / отписаться на это событие более одного раза.

internal class Inputs
{
    public int Id { get; set; }
    public string Name { get; set; }
}

internal List<Inputs> InputData = new List<Inputs>();
internal BindingSource bindingSource;

private void button1_Click(object sender, EventArgs e)
{
    bindingSource = new BindingSource();

    InputData.AddRange(new [] { 
        new Inputs() { Id = 5476, Name = "Smith" },
        new Inputs() { Id = 5477, Name = "Marlin" }
    });

    bindingSource.DataSource = InputData;

    Binding tboxBind = new Binding("Text", bindingSource, "Id", false, DataSourceUpdateMode.OnPropertyChanged);

    tboxBind.Parse += (pObj, pEvt) =>
    {
        if (!int.TryParse(pEvt.Value.ToString(), out int value))
            bindingSource.ResetCurrentItem();
    };
    textBox1.DataBindings.Add(tboxBind);
    dataGridView1.DataSource = bindingSource;
}
0
ответ дан Jimi 18 January 2019 в 10:43
поделиться
Другие вопросы по тегам:

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