Обновление базы данных SQL с помощью DataGrid в WPF - PullRequest
0 голосов
/ 19 февраля 2020

, поэтому в моем приложении есть пункт меню администрирования, который извлекается из моей модели представления как ItemSource, который извлекается из SQL и добавляется к ObservableCollection.

Панель администратора

Я бы хотел, чтобы он обновил SQL при нажатии кнопки разрешения на обновление. Вот мой DataGrid

XAML:

<GroupBox  Header="Update User Permissions">
    <DataGrid ItemsSource="{x:Static model:ViewModel.Users}" AutoGenerateColumns="False" IsTextSearchEnabled="True">
        <DataGrid.Columns>
            <DataGridTextColumn IsReadOnly="True" Header="Name" Binding="{Binding Name}"/>
            <DataGridTextColumn IsReadOnly="True" Header="Username" Binding="{Binding Username}"/>
            <DataGridCheckBoxColumn Header="Add Truck" Binding="{Binding CanAddTruck}"/>
            <DataGridCheckBoxColumn Header="Park Truck" Binding="{Binding CanParkTruck}"/>
            <DataGridCheckBoxColumn Header="Load Truck" Binding="{Binding CanLoadTruck}"/>
            <DataGridCheckBoxColumn Header="Admin" Binding="{Binding IsAdmin}"/>
        </DataGrid.Columns>
    </DataGrid>
</GroupBox>
<UniformGrid Columns="2" Grid.Row="2">
    <Button Content="Cancel"/>
    <Button Content="Update permissions" Command="{Binding SaveUserDB_Command}" />
</UniformGrid>

Модель пользователя:

public AllUsers()
{
    SaveUserDB_Command = new RelayCommand(SaveUserDB_Command_Execute, SaveUserDB_Command_CanExecute);
}

public AllUsers(SqlDataReader reader)
{
    Name = reader.GetString("Name");
    Username = reader.GetString("Username");
    CanAddTruck = Convert.ToBoolean(reader["CanAddTruck"]);
    CanParkTruck = Convert.ToBoolean(reader["CanParkTruck"]);
    CanLoadTruck = Convert.ToBoolean(reader["CanLoadTruck"]);
    IsAdmin = Convert.ToBoolean(reader["IsAdmin"]);
}

private string _Name;
public string Name
{
    get { return _Name; }
    set { _Name = value; RaisePropertyChanged("Name"); }
}

private string _Username;
public string Username
{
    get { return _Username; }
    set { _Username = value; RaisePropertyChanged("Username"); }
}

private bool _CanAddTruck;
public bool CanAddTruck
{
    get { return _CanAddTruck; }
    set { _CanAddTruck = value; RaisePropertyChanged("CanAddTruck"); }
}

private bool _CanParkTruck;
public bool CanParkTruck
{
    get { return _CanParkTruck; }
    set { _CanParkTruck = value; RaisePropertyChanged("CanParkTruck"); }
}

private bool _CanLoadTruck;
public bool CanLoadTruck
{
    get { return _CanLoadTruck; }
    set { _CanLoadTruck = value; RaisePropertyChanged("CanLoadTruck"); }
}

private bool _IsAdmin;
public bool IsAdmin
{
    get { return _IsAdmin; }
    set { _IsAdmin = value; RaisePropertyChanged("IsAdmin"); }
}

public RelayCommand SaveUserDB_Command { get; private set; }

void SaveUserDB_Command_Execute(object param)
{
    Debug.Print("Not Working");
    using var conn = new SqlConnection(Settings.Default.ConnectionString);

    conn.Open();
    string query = @"IF EXISTS(SELECT * FROM dbo.Permissions WHERE Username = @user)
                    UPDATE dbo.Permissions 
                    SET CanAddTruck = @addTruck, CanParkTruck = @parkTruck, CanLoadTruck = @loadTruck, IsAdmin = @admin
                    WHERE Username = @user
                ELSE
                    INSERT INTO dbo.Permissions(Name, Username, CanAddTruck, CanParkTruck, CanLoadTruck, IsAdmin) VALUES(@name, @user, @addTruck, @parkTruck, @loadTruck, @admin);";

    var cmd = new SqlCommand(query, conn);
    cmd.Parameters.AddWithValue("@name", Name);
    cmd.Parameters.AddWithValue("@user", Username);
    cmd.Parameters.AddWithValue("@addTruck", CanAddTruck);
    cmd.Parameters.AddWithValue("@parkTruck", CanParkTruck);
    cmd.Parameters.AddWithValue("@loadTruck", CanLoadTruck);
    cmd.Parameters.AddWithValue("@admin", IsAdmin);
    try
    {
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}
bool SaveUserDB_Command_CanExecute(object param)
{
    return true;
}

Просмотр модели:

public static void GetUsers()
{
    Users.Clear();

    using var conn = new SqlConnection(Settings.Default.ConnectionString);

    conn.Open();
    string qry = "SELECT * FROM dbo.Permissions";
    var cmd = new SqlCommand(qry, conn);

    var reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        Users.Add(new AllUsers(reader));
    }
    conn.Close();
}

public static ObservableCollection<AllUsers> Users { get; set; } = new ObservableCollection<AllUsers>();

Нажатие на обновление кнопка permissions должна увидеть все изменения в DataGrid и скопировать на SQL. Я думаю, что мне нужно получить значения строк, но я теряюсь, как. Некоторая помощь будет оценена!

Спасибо.

1 Ответ

0 голосов
/ 19 февраля 2020

Это должен быть комментарий, но я не могу их сделать.

Из вашего кода не похоже, что вы инициализировали SaveUserDB_Command. Есть SaveUserDB_Command_CanExecute и SaveUserDB_Command_Execute, но они бесполезны, если их не вызывает объект RelayCommand.

------- ОБНОВЛЕНИЕ -------

Поскольку RelayCommand является классом, который реализует интерфейс ICommand , который вам необходим для реализации самостоятельно, я не уверен, как вы спроектировали конструктор.

Предположим, это что-то вроде

public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)    
{
    this.execute = execute;
    this.canExecute = canExecute;
}

Вам нужно инициализировать SaveUserDB_Command как

SaveUserDB_Command = new RelayCommand(SaveUserDB_Command_Execute, SaveUserDB_Command_CanExecute);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...