Я пытаюсь удалить выбранный элемент из раскрывающегося списка с помощью 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;
}
}
вы не проверяете свойство Page.IsPostBack в методе Page_load, из-за чего раскрывающийся список снова строится при каждом нажатии кнопки удаления, что вызывает обратную передачу.





Я не уверен, в чем проблема и почему вы пытаетесь восстановить книгу, которую удаляете, НО, каждый раз, когда вы вносите изменения в источник данных, вам необходимо повторно привязать ее к элементу управления.
Попробуйте повторить следующий блок в btnDelete_Click
ddlDelete.DataSource = catalogueInstance.books;
ddlDelete.DataTextField = "title";
ddlDelete.DataValueField = "id";
Другая возможная проблема заключается в том, что, поскольку вы не выполняете начальную привязку при !Page.IsPostback(), вы фактически повторно связываете источник данных перед в событии удаления. Помните, что Page_Load - это всегда - первое событие после обратной передачи.
РЕДАКТИРОВАТЬ
Вы пытаетесь использовать Catalogue catalogueInstance в качестве глобальной переменной, а затем при загрузке страницы читаете один и тот же файл снова и снова.
Viewstate, чтобы состояние глобальной переменной сохраняется происходило при различных обновлениях страниц.Попробуйте следующее, более простое решение, и я уверен, что вы заметите проблему:
//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.
Теперь я получаю эту ошибку: исключение типа «System.NullReferenceException» произошло в App_Web_0zdujtuy.dll, но не было обработано в пользовательском коде. Дополнительная информация: ссылка на объект не установлена на экземпляр объекта. при запуске страницы, когда она попадает сюда: ddlDelete.DataSource = catalogueInstance.books;
смотри мой РЕДАКТИРОВАТЬ
Вы должны использовать 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();
}
}
это только часть проблемы. он не выполняет повторную привязку источника данных после события удаления
Что не так с вашим текущим решением?