DataGrid с привязкой к DataTable: как вместо Null задать значение по умолчанию для новых строк

158
31 мая 2019, 21:10

DataGrid используется для добавления, изменения и удаления строк данных, загружаемых из базы данных MS SQL. При добавлении новой строки если пользователь заполняет не все текстовые поля в таблицу БД сохраняется в незаполненных полях значение Null, что в дальнейшем приводит к проблемам при работе с этой таблицей. Необходимо вместо Null сохранять в эти поля пустую строку. Не могу понять как получить доступ к новой добавляемой строке и какое событие какого объекта перекрыть для подстановки вместо Null пустой строки. Подскажите в какую сторону смотреть?

private void LoadEmployees()
{
    string sql = "SELECT * FROM Employees";
    employeesTable = new DataTable();
    SqlConnection connection = null;
    try
    {
        connection = new SqlConnection(connectionString);
        SqlCommand command = new SqlCommand(sql, connection);
        employeesAdapter = new SqlDataAdapter(command);
        // установка команды на добавление для вызова хранимой процедуры
        employeesAdapter.InsertCommand = new SqlCommand("sp_InsertEmployee", connection);
        employeesAdapter.InsertCommand.CommandType = CommandType.StoredProcedure;
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Name", SqlDbType.NVarChar, 40, "Name"));
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Patronymic", SqlDbType.NVarChar, 40, "Patronymic"));
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Surname", SqlDbType.NVarChar, 40, "Surname"));
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Position", SqlDbType.NVarChar, 40, "Position"));
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@MobilePhone", SqlDbType.NVarChar, 20, "MobilePhone"));
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Rights", SqlDbType.TinyInt, 0, "Rights"));
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Login", SqlDbType.NVarChar, 40, "Login"));
        employeesAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Password", SqlDbType.NVarChar, 20, "Password"));
        SqlParameter parameter = employeesAdapter.InsertCommand.Parameters.Add("@Code", SqlDbType.Int, 0, "Code");
        parameter.Direction = ParameterDirection.Output;
        connection.Open();
        employeesAdapter.Fill(employeesTable);
        dgEmployees.ItemsSource = employeesTable.DefaultView;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if (connection != null)
            connection.Close();
    }
}

XAML

<DataGrid AutoGenerateColumns="False" x:Name="dgEmployees">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Code}" Header="Код" Width="60"/>
        <DataGridTextColumn Binding="{Binding Name}" Header="Имя" Width="130"/>
        <DataGridTextColumn Binding="{Binding Patronymic}" Header="Отчество" Width="130"/>
        <DataGridTextColumn Binding="{Binding Surname}" Header="Фамилия" Width="130"/>
        <DataGridTextColumn Binding="{Binding Position}" Header="Должность" Width="200"/>
        <DataGridTextColumn Binding="{Binding MobilePhone}" Header="Мобильный телефон" Width="130"/>
        <DataGridTextColumn Binding="{Binding Rights}" Header="Права доступа" Width="130"/>
        <DataGridTextColumn Binding="{Binding Login}" Header="Логин" Width="130"/>
        <DataGridTextColumn Binding="{Binding Password}" Header="Пароль" Width="130"/>
    </DataGrid.Columns>
</DataGrid>
Answer 1

В общем, с проблемой разобрался, спасибо за подсказку Alexander Petrov. При подключенном к DataGrid источнике данных DataTable многие манипуляции непосредственно с DataGrid не работают. Как и не вызываются некоторые события DataTable. Помогла обработка события TableNewRow:

    employeesTable.TableNewRow += new
        DataTableNewRowEventHandler(EmployeesTable_NewRow);
private static void EmployeesTable_NewRow(object sender, DataTableNewRowEventArgs e)
{
    e.Row["Name"] = "";
    e.Row["Patronymic"] = "";
    e.Row["Surname"] = "";
    e.Row["Position"] = "";
    e.Row["MobilePhone"] = "";
    e.Row["Rights"] = 0;
    e.Row["Login"] = "";
    e.Row["Password"] = "";
}
READ ALSO
Magento2. Create custom form

Magento2. Create custom form

Всем привет

142
Как получить масив checkbox?

Как получить масив checkbox?

Я хочу добавить при отправке сообщения выбраные эти данные

113
Как foreach добавить в общий mes?

Как foreach добавить в общий mes?

Я не могу понять в каком виде я могу объединить $mes и foreach

114
Вывод изображений с пагинацией в цикле на странице записи

Вывод изображений с пагинацией в цикле на странице записи

Как можно вывести все загруженные изображения из таблицы wp_posts с типом attachments? и чтобы была пагинацияТ

147