Удаление элемента из списка C#

Я пытаюсь удалить выбранный элемент из раскрывающегося списка с помощью C#, но не могу заставить его работать. Может ли кто-нибудь показать мне, где я ошибаюсь? Я пробовал использовать теги RemoveAll и RemoveAt (которые, как мне кажется, я исправил), но, возможно, я размещаю их не в том месте? Спасибо.

public partial class DeleteBook : System.Web.UI.Page
{
Catalogue catalogueInstance;

protected void btnDelete_Click(object sender, EventArgs e)
{
    int id = Int32.Parse(txtID.Text);
    Book book = catalogueInstance.books.RemoveAt(b => b.id == id);
    if (book != null)
    {
        book.title = txtTitle.Text;
        book.year = Int32.Parse(txtYear.Text);
        book.author = txtAuthor.Text;
        book.publisher = txtPublisher.Text;
        book.isbn = txtISBN.Text;

        string jsonText = JsonConvert.SerializeObject(catalogueInstance);
        File.WriteAllText(FILENAME, jsonText);
    }
    txtSummary.Text = "Book ID of " + id + " has Been deleted from the 
    Catalogue" + Environment.NewLine;
}
}

Что не так с вашим текущим решением?

DaImTo 15.05.2018 14:33

вы не проверяете свойство Page.IsPostBack в методе Page_load, из-за чего раскрывающийся список снова строится при каждом нажатии кнопки удаления, что вызывает обратную передачу.

Niladri 15.05.2018 14:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
92
2

Ответы 2

Я не уверен, в чем проблема и почему вы пытаетесь восстановить книгу, которую удаляете, НО, каждый раз, когда вы вносите изменения в источник данных, вам необходимо повторно привязать ее к элементу управления.

Попробуйте повторить следующий блок в btnDelete_Click

ddlDelete.DataSource = catalogueInstance.books;
ddlDelete.DataTextField = "title";
ddlDelete.DataValueField = "id";

Другая возможная проблема заключается в том, что, поскольку вы не выполняете начальную привязку при !Page.IsPostback(), вы фактически повторно связываете источник данных перед в событии удаления. Помните, что Page_Load - это всегда - первое событие после обратной передачи.

РЕДАКТИРОВАТЬ

Вы пытаетесь использовать Catalogue catalogueInstance в качестве глобальной переменной, а затем при загрузке страницы читаете один и тот же файл снова и снова.

  1. Глобальные переменные на asp.net нельзя использовать так же, как в формах выигрыша. Вам нужно заглянуть в Viewstate, чтобы состояние глобальной переменной сохраняется происходило при различных обновлениях страниц.
  2. Каждый раз, когда страница обновляется, вы продолжаете повторно загружать каталог из файла, тем самым заменяя удаленные строки. Помните, что вы удаляете только элементы из каталога, но они все еще находятся в файле.

Попробуйте следующее, более простое решение, и я уверен, что вы заметите проблему:

//Filepath for json file
// this can stay here
const string FILENAME = 
@"C:\Users\tstra\Desktop\19456932_CSE2ICX_Assessment_3\Bin\Books.json";

protected void Page_Load(object sender, EventArgs e)
{
    // this needs stay in here, enclosed within `!Page.IsPostback()`
    if (!Page.IsPostback()) 
    {
        Catalogue catalogueInstance;
        // reading data contained in the json filepath
        string jsonText = File.ReadAllText(FILENAME);

        //convert objects in json file to lists
        catalogueInstance = JsonConvert.DeserializeObject<Catalogue>(jsonText);

        // save the current state into ViewState
        ViewState["catalogueInstance"] = catalogueInstance;

        ddlDelete.DataSource = catalogueInstance.books;
        ddlDelete.DataTextField = "title";
        ddlDelete.DataValueField = "id";

        //binding the data to Drop Down List
        ddlDelete.DataBind();
   }
}

protected void btnDelete_Click(object sender, EventArgs e)
{
    // get catalogueInstance back from ViewState before trying to use it
    Catalogue catalogueInstance = (Catalogue)ViewState["catalogueInstance"];

    int id = Int32.Parse(txtID.Text);
    Book book = catalogueInstance.books.RemoveAt(b => b.id == id);
    if (book != null)
    {
        book.title = txtTitle.Text;
        book.year = Int32.Parse(txtYear.Text);
        book.author = txtAuthor.Text;
        book.publisher = txtPublisher.Text;
        book.isbn = txtISBN.Text;    

        string jsonText = JsonConvert.SerializeObject(catalogueInstance);
        File.WriteAllText(FILENAME, jsonText);

        // you need to reset, and rebind the datasource again
        ddlDelete.DataSource = catalogueInstance.books;
        ddlDelete.DataTextField = "title";
        ddlDelete.DataValueField = "id";

        //binding the data to Drop Down List
        ddlDelete.DataBind();
    }
    txtSummary.Text = "Book ID of " + id + " has Been deleted from the 
    Catalogue" + Environment.NewLine;
}

Я предполагаю, что Postback - это основная проблема здесь ... Я предпочитаю RemoveAll при удалении элементов, кроме использования index.

Niladri 15.05.2018 14:40

Теперь я получаю эту ошибку: исключение типа «System.NullReferenceException» произошло в App_Web_0zdujtuy.dll, но не было обработано в пользовательском коде. Дополнительная информация: ссылка на объект не установлена ​​на экземпляр объекта. при запуске страницы, когда она попадает сюда: ddlDelete.DataSource = catalogueInstance.books;

Strato 15.05.2018 14:57

смотри мой РЕДАКТИРОВАТЬ

Ted 15.05.2018 15:26

Вы должны использовать IsPostBack в Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // reading data contained in the json filepath
        string jsonText = File.ReadAllText(FILENAME);

        //convert objects in json file to lists
        catalogueInstance = JsonConvert.DeserializeObject<Catalogue>(jsonText);

        ddlDelete.DataSource = catalogueInstance.books;
        ddlDelete.DataTextField = "title";
        ddlDelete.DataValueField = "id";

        //binding the data to Drop Down List
        ddlDelete.DataBind();
    }
}

это только часть проблемы. он не выполняет повторную привязку источника данных после события удаления

Ted 15.05.2018 14:38

Другие вопросы по теме