Как откатывать изменения в управлении WPF DataGrid с помощью LINQ-SQL?

Прежде всего, не используйте списки. Используйте наборы - они не допускают повторения, и я уверен, что вам не нужна возможность иметь игрока в одном и том же списке дважды (держу пари, что в вашем домене это не имеет смысла).

В наборе есть метод contains, который сообщает вам, содержится ли элемент в наборе или нет - без каких-либо циклов.

Тогда, если вы хотите иметь возможность определить, в каком из наборов содержится игрок (например, был ли он в футболе, футболе или волейболе), не повторяя этот конкретный вид спорта - вы можете поместить эти наборы в Map где String со спортивным именем будет ключом, а Set<String> будет значением.

И да, не давайте локальных переменных именам полей, начинающимся с заглавной буквы - это противоречит соглашениям Java-кода.

Пример кода:

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

public class Test {

    Map<String, Set<String>> sportsToPlayers = new LinkedHashMap<>();

    public void populatePlayers() {
        Set<String> footballPlayers = new LinkedHashSet<>();
        Set<String> volleyballPlayers = new LinkedHashSet<>();
        Set<String> soccerPlayers = new LinkedHashSet<>();

        footballPlayers.add("Marcus Allen");
        footballPlayers.add("Kyle Alston");
        footballPlayers.add("Troy Apke");
        footballPlayers.add("Matthew Baney");
        footballPlayers.add("Saquon Barkley");

        volleyballPlayers.add("Kendall White");
        volleyballPlayers.add("Kaitlyn Hord");
        volleyballPlayers.add("Bryanna Weiskircher");
        volleyballPlayers.add("Nia Reed");
        volleyballPlayers.add("Serena Gray");
        volleyballPlayers.add("Alli Frantti");
        // Added to test for multiple sports for 1 player
        volleyballPlayers.add("Kat Asman");

        soccerPlayers.add("Amanda Dennis");
        soccerPlayers.add("Emily Ogle");
        soccerPlayers.add("Ellie Jean");
        soccerPlayers.add("Kat Asman");
        soccerPlayers.add("Laura Suero");

        sportsToPlayers.put("Football", footballPlayers);
        sportsToPlayers.put("Volleyball", volleyballPlayers);
        sportsToPlayers.put("Soccer", soccerPlayers);
    }

    private Set<String> findPlayerSports(String playerName) {
        Set<String> result = new LinkedHashSet<>();
        for (Map.Entry<String, Set<String>> sportsToPlayersEntry : sportsToPlayers.entrySet()) {
            String sportName = sportsToPlayersEntry.getKey();
            Set<String> playerNames = sportsToPlayersEntry.getValue();
            if (playerNames.contains(playerName)) {
                result.add(sportName);
            }
        }
        return result;
    }

    private String findPlayerSport(String playerName) {
        for (Map.Entry<String, Set<String>> sportsToPlayersEntry : sportsToPlayers.entrySet()) {
            String sportName = sportsToPlayersEntry.getKey();
            Set<String> playerNames = sportsToPlayersEntry.getValue();
            if (playerNames.contains(playerName)) {
                return sportName;
            }
        }
        return null;
    }

    public Test() {
        populatePlayers();
    }

    public static void main(String[] args) throws Exception {
        Test test = new Test();
        // Find all sports for player
        System.out.println(test.findPlayerSports("Kat Asman"));

        // Find one sport for player
        System.out.println(test.findPlayerSport("Kat Asman"));

    }
}
5
задан Edward Tanguay 24 March 2009 в 12:38
поделиться

1 ответ

Прежде всего действительно ли это - требование, чтобы смочь изменить CustomerID? Если бы это генерирует ошибку, я вообразил бы дело не в этом, таким образом, необходимо отметить тот столбец как ReadOnly (IsReadonly = "Верный", что я верю).

Во-вторых, если необходимо обновить объект от базы данных, необходимо назвать Обновление () на datacontext, передав объект в качестве параметра. Это задержит текущие значения от базы данных.

В-третьих, для контакта с редактированием и откатами на целом объекте DataGrid поддерживает интерфейс IEditableObject, который позволяет объекту выставить локальные подобные транзакции методы (в основном, это делает внутренние копии данных каждый раз, когда BeginEdit называют и может вернуться изменения в случае необходимости). Это - весь ручной процесс, но это - интерфейс, который существовал в течение долгого времени в Windows Forms, если я не ошибаюсь, и необходимо смочь найти тонны информации об этом (или кто-то лучше сведущий, чем я здесь может дать Вам некоторые примеры).

Вы могли реализовать тот интерфейс на своих объектах (через частичные классы, так как Ваши объекты являются классами LinqToSQL, по-видимому, сгенерированными разработчиком).

Вот статья о DataGrid и некоторых опциях, которые Вы имеете с ним. Это немного старо, но это могло бы дать Вам еще некоторые подсказки. Вот другой, короче один.

Между прочим, проверьте инструментарий WPF снова, они просто выпустили новую версию (версия марта 2009), который мог бы иметь больше поддержки выпуска/проверки, чем это использовало также.

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

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