Как сохранить пользовательский ввод в ListView? - PullRequest
0 голосов
/ 01 мая 2018

мой проект

enter image description here

Мне было интересно, как сохранить пользовательский ввод в ListView и предотвратить его исчезновение при переходе в другую форму

if (string.IsNullOrEmpty(txtName.Text) || string.IsNullOrEmpty(txtReview.Text))
    return;

    ListViewItem item = new ListViewItem(txtName.Text);
    item.SubItems.Add(txtReview.Text);
    listView1.Items.Add(item);
    txtName.Clear();
    txtReview.Clear();

1 Ответ

0 голосов
/ 01 мая 2018

Насколько я понял тебя! У вас есть форма, в которой вы добавляете отзывы. Вы закрываете его вскоре после добавления отзыва. Но вы хотите получить все предыдущие отзывы при повторном посещении этой формы.

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

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

Для этого подхода я бы рекомендовал реализовать архитектуру MVVM
По крайней мере, вы должны создать класс, который хранит все данные статически (почему статично? это интересный вопрос, и я оставляю его вам, чтобы узнать ответ)

Пример кода для модели:

public class Model
{
    public static Dictionary<string, Review> ReviewData;
    //this method should be called at application startup.
    public static void SetModel()
    {
        //Desrialize lastly saved file, I'm just initializing it with new 
        ReviewData = new Dictionary<string, Review>();
    }
    public static void AddReview(string movie, string reviewerName, string review)
    {
        if (!ReviewData.ContainsKey(movie + "-" + reviewerName))
        {
            ReviewData.Add(movie + "-" + reviewerName, new Review(reviewerName, reviewerName));
        }
    }
}

public class Review
{
    public string reviewerName;
    public string review;
    public Review(string reviewerName, string review)
    {
        this.reviewerName = reviewerName;
        this.review = review;
    }
}

Пример кода для добавления формы отзыва:

    private void btnPost_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(txtName.Text) || string.IsNullOrEmpty(txtReview.Text))
            return;
        //First we should set Model data
        Model.AddReview("moive1", txtName.Text, txtReview.Text);
        LoadListView();
    }

    private void AddReviewForm_Load(object sender, EventArgs e)
    {
        LoadListView();
    }

    private void LoadListView()
    {
        listView1.Clear();
        foreach (string reviewKey in Model.ReviewData.Keys)
        {
            Review review = Model.ReviewData[reviewKey];
            ListViewItem item = new ListViewItem(review.reviewerName);
            item.SubItems.Add(review.review);
            listView1.Items.Add(item);
        }
    }

И, наконец, при закрытии всего приложения сохраняйте последнюю обновленную копию Model.ReviewData (Сериализуйте ее).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...