Связанный с данными элемент управления Windows Forms C# не сохраняет значение, если Вы не покидаете поле

Я видел, что ответ в Связанном с данными элементе управления Windows Forms не распознает изменение до проигрывающего фокуса.

Но это не полностью отвечает на вопрос для меня. У меня есть та же самая ситуация. На ToolStrip_click я прохожу все свои средства управления, и я вынуждаю "WriteValue ()", но он все еще возвращается к предыдущему значению перед сохранением. Кто-либо может предложить, как я могу зафиксировать это? Я реализовывал это неправильно?

(См. код для текущего (нерабочего) решения.)

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // Make sure that all items have updated databindings.
    foreach (Control C in this.Controls)
    {
        foreach (Binding b in C.DataBindings)
        {
            // Help: this doesn't seem to be working.
            b.WriteValue();
        }
    }
}

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

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // Make sure that all text fields have updated by forcing everything
    // to lose focus except this lonely little label.
    label44.Focus();
}

11
задан Community 23 May 2017 в 12:17
поделиться

3 ответа

Инструмент STREASSTRIPBUTTON не имеет фокусировки при нажатии. Вы можете добавить какой-нибудь код (временно) фокусировать еще один элемент управления. Вы можете сосредоточить метку (как нейтральный манекен).

3
ответ дан 3 December 2019 в 02:30
поделиться

Попробуйте следующее:

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // Make sure that all items have updated databindings.
    foreach (Control C in this.Controls)
    {
        C.SuspendLayout();
        foreach (Binding b in C.DataBindings)
        {
            // Help: this doesn't seem to be working.
            b.WriteValue();
        }
        C.ResumeLayout();
    }
}
0
ответ дан 3 December 2019 в 02:30
поделиться

Я обнаружил, что сначала ограниченные контексты и совокупные корни казались самой простой концепцией в DDD. Это до тех пор, пока вы не придете к реализации приложения с реальной проблемой. Здесь нет простого ответа. Это полностью зависит от требований бизнеса (масштабируемость, доступность, задержка, согласованность и т.д.). «Правильное» решение - это решение, которое уравновешивает эти проблемы, чтобы наилучшим образом соответствовать вашим потребностям.

На приведенном примере есть несколько вариантов:

  • Один большой ограниченный контекст
  • Отдельные ограниченные контексты, с дублированными данными (возможно, реализованными с помощью системы сообщений публикации/подписки)
  • Извлекать пользователей и элементы каталога в свой собственный ограниченный контекст и иметь другие ограниченные контексты доступа к ним через сервис

Одна вещь, чтобы иметь в виду, что запросы потребности часто очень разные Часто можно упростить конструкцию приложения, чтобы иметь отдельные ограниченные контексты исключительно для запроса. Если это звучит так, как будто это возможно, посмотрите на CQRS.

-121--2485369-

Я бы использовал метод расширения, который получает все открытые статические методы и проверяет метод с правильным именем и возвращаемым типом.

public static class TypeExtentions
{
    public static bool ImplicitlyConvertsTo(this Type type, Type destinationType)
    {

        if (type == destinationType)
            return true;


        return (from method in type.GetMethods(BindingFlags.Static |
                                               BindingFlags.Public)
                where method.Name == "op_Implicit" &&
                      method.ReturnType == destinationType
                select method
                ).Count() > 0;
    }
}
-121--4378936-

К чему вы привязываетесь? Если это DataSet, DataTable и т.д., или лучше, BindingSource, следует вызвать EndEdit:

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    // Assuming that you are binding to bindingSource1:
    bindingSource1.EndEdit();
}

Я реализую интерфейс ISave на моих формах для обработки грязного состояния и сохранения и всякий раз, когда грязное состояние проверяется (всякий раз, когда вызывается IsDirty), я всегда EndEdit в моем источнике привязки:

interface ISave
{
    bool IsDirty;
    bool Save(bool force);
}

С помощью этого интерфейса, когда, скажем, приложение завершает работу, я могу легко выполнить итерацию с помощью проверки открытых окон MdiChild, чтобы увидеть, была ли сохранена какая-либо информация, путем приведения дочерней формы к ISave и проверки значения IsDirty . Здесь я вызываю EndEdit в соответствующем источнике привязки или, если применимо, в элементе управления привязкой (например, сетке).

И простите за беспорядок, но я подумал, что это может быть полезно. Остальное работает так:

Save () принимает параметр «force», так что я могу иметь кнопку «Save & Close» форму (сохраняет пользователю дополнительный щелчок или подтверждение с запросом, если они хотят сохранить свои изменения). Если сила имеет значение false, метод Save () отвечает за запрос пользователя на сохранение. Если это правда, предполагается, что пользователь уже решил, что он определенно хочет сохранить свою информацию, и это подтверждение пропускается.

Save () возвращает значение bool- true, если безопасно продолжить выполнение вызывающего кода (предположительно, события Form_Closing). В этом случае (если сила была ложной), учитывая значение YesNoCancel, пользователь либо выбрал Yes , либо No , а само сохранение не вызвало ошибки. Либо Save () возвращает значение false в случае выбора пользователем Cancel или ошибки (другими словами, сообщения вызывающему коду об отмене закрытия формы).

Обработка ошибок зависит от условных обозначений при обнаружении исключений. Это может быть либо обнаружено в методе Save () и отображено пользователю, либо, возможно, в таком случае, как FormClosing, где .Cancel будет набором на true.

Используется при закрытии формы:

private void form1_FormClosing(object sender, CancelEventArgs e)
{
    if (IsDirty)
        e.Cancel = !Save(false);
}

Используется при принудительном сохранении с помощью кнопки Save & Close, это выглядит следующим образом:

private void btnSaveAndClose_Click(object sender, EventArgs e)
{
     if (IsDirty)
        if (Save(true))
            Close();
}

В любом случае, немного больше, чем вы просили, но я надеюсь, что это поможет!

3
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

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