Как очистить ячейку (чтобы она получала значение NULL) в (WPF) DataGrid? - PullRequest
5 голосов
/ 05 марта 2011

У нас есть столбец, связанный с целочисленным значением sql, которое можно обнулять.Когда пользователь пытается «очистить» ячейку в DataGrid, мы получаем ошибку проверки

«... не удалось преобразовать».

Как сделать его пустым и привязать «нулевое» значение к базовому столбцу?

Я уже 2 дня гуглял эту проблему и нашел что-нибудь.Я пытался отредактировать свой комментарий к вам HCL, но он никогда не сохранится.

Я знаком с IValueConverters.Я написал один для обработки наших процентов (чтобы пользователь мог ввести «50%», и он преобразуется в «.5»).Я пытаюсь сделать что-то очень похожее, но когда значение возвращается как Null (я написал фиктивный IValueConterter для его отладки), я просто хочу, чтобы оно было сохранено в базе данных как Null.Может мне просто нужно установить DBNullValue?Это просто кажется большой работой для чего-то, что, я думаю, может иметь встроенную собственность.Я попытался использовать свойство TargetNullValue в столбце (DataGridBoundColumn) и установить его на DBNull.Value, но оно не изменило значение (исходя из моего фиктивного IValueConverter, оно все еще входит как обычное (строка) NULL.

Я просто хочу иметь возможность сохранить нулевое значение в базе данных для этого (целочисленного типа) столбца.

** Последнее добавление **

Хорошая мысль HCL, я забываю, что весь мир иногда не ADO.

Я привязываюсь к таблице SQL. В столбце речь идет о int, который допускает NULL s.

Столбцы создаются с использованием AutoGeneratingColumn, поэтому он в основном просто подключает их «автоматически» (определенные стили, такие как Right Justify, применяются в этом методе, но не для этого столбца). Этот подход используется, потому что приложениеэто в значительной степени замена «доступа». Наш ИТ-директор поручил нам удалить доступ от пользователей, так что это было решением (создать собственный MS Access). В любом случае, поскольку он может открыть любую таблицу (и создать таблицы, столбцы и т. д.)просто "Автогенерация" на основе столбцовна столе, который был открыт.Хотя, поскольку существуют определенные столбцы, о которых приложение по сути знает, например Discount_Pct, при обнаружении одного из этих столбцов оно выполняет некоторые «особые действия» (например, присваивает IValueConverter, который я описал выше).Хотя, как я сказал ... для этой конкретной колонки, ничего особенного с ней не сделано.Это просто обычное целое число SQL (обнуляемое), которое автоматически генерируется.

Ответы [ 3 ]

7 голосов
/ 08 марта 2011

Я только что нашел недвижимость, которую искал !!

TargetNullValue

Этот пост объясняет это: ЗДЕСЬ

Проблема в том, что эти столбцы генерируются с использованием «AutoGenerateColumns» (потому что источник данных ... таблица SQL ... является "динамическим"). Если бы я мог выяснить, как получить тип столбца таблицы (примитив), я уже знаю, как увидеть, является ли он Nullable, тогда я мог бы установить это значение для этого столбца. (Я все еще не понимаю, почему AutoGenerateColumns не обрабатывает это автоматически !!)

3 голосов
/ 06 сентября 2014

Расширяя самоответ Шейна, я обнаружил, что свойство TargetNullValue доступно для объектов DataGridBoundColumn. Вы можете использовать дополнительную логику, описанную из этого комментария , чтобы сделать это условным. К сожалению, этот пост не объясняет, как связать его логику с DataGrid, поэтому вот мое решение:

<DataGrid AutoGenerateColumns="True" AutoGeneratingColumn="m_grid_AutoGeneratingColumn"/>

И ...

public void m_grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    // Make all columns nullable
    ((DataGridBoundColumn)e.Column).Binding.TargetNullValue = string.Empty;
}

Я был так расстроен этой проблемой. Надеюсь, это кому-нибудь поможет.

1 голос
/ 05 марта 2011

Я решил пойти по маршруту IValueConverter и для этого поля.

Вот что я написал (и это работает, я все еще чувствую, что, должно быть, есть более простой способ! Lol):

    [ValueConversion(typeof(Int32), typeof(String))]
    public class IntDBNullConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return "";
            else if (DBNull.Value.Equals(value))
                return "";
            else
                return value.ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string str = value as string;
            if (String.IsNullOrEmpty(str))
                return DBNull.Value; // returns DBNull.Value 

            Int32 result = 0;

            Int32.TryParse(str, out result);

            return result;
        }
    }
...