Ошибка индекса при удалении и создании объекта в таблице SQLiteC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка индекса при удалении и создании объекта в таблице SQLite

Сообщение Anonymous »

Здесь новичок в C# и .net MAUI.
Я пытаюсь решить проблему, когда индекс выходит за пределы допустимого диапазона, когда я удаляю объект в базе данных SQLite и создаю любые новые объекты в базе данных SQLite. замена.
Мое приложение содержит 2 страницы и 2 дополнительных класса с кодом.
Похоже, проблема заключается в методе db_refresh в MainPage, где Количество каждого термина не уменьшается по сравнению со счетчиком списка терминов, что приводит к ошибке Index. Вот синтаксис ошибки:

Код: Выделить всё

System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')'
Однако правильное количество кнопок генерируется в методеgenerateInterface.
MainPage.xaml.cs

Код: Выделить всё

public partial class MainPage : ContentPage
{
public static List termList = new List();
public static string dbLocation = Path.Combine(FileSystem.AppDataDirectory, "MyData.db");
public MainPage()
{
File.Delete(dbLocation);
dbActions.initiateDbTables();
InitializeComponent();
db_refresh();
generateInterface();
}
protected override void OnAppearing()
{
AppShell.SetBackgroundColor(this, Color.FromRgb(0, 0, 0));
db_refresh();
generateInterface();
}
public static void db_refresh()
{
termList.Clear();
var dataBase = new SQLiteConnection(dbLocation);
var queriedTerm = dataBase.Query("SELECT * FROM Terms");
foreach (Term eachTerm in queriedTerm)
{
termList.Add(eachTerm);
}
}
public void generateInterface()
{

termView.Children.Clear();

foreach (Term myTerm in termList)
{
Button termNameButton = new Button
{
Text = myTerm.termName,
BackgroundColor = Colors.Green,
TextColor = Colors.White,
FontAttributes = FontAttributes.Bold,
};
termNameButton.Clicked += async (sender, e) =>
{
await Navigation.PushAsync(new TermPage(myTerm.termId));
};
termView.Children.Add(termNameButton);
}

Button termAddButton = new Button()
{
Text = "Add Term",
BackgroundColor = Colors.Black,
TextColor = Colors.White,
FontAttributes = FontAttributes.Bold,
};
termAddButton.Clicked += void (sender, args) => clickNewTerm();
termView.Children.Add(termAddButton);
}
public void clickNewTerm()
{
dbActions.addNewDbTerm();
generateInterface();
}
}
Метод удаления термина расположен на отдельной странице (TermPage), доступ к которой осуществляется при нажатии кнопки «Условия» на главном экране. Вот код TermPage:

Код: Выделить всё

public Term currentTerm;
public SQLiteConnection dbConnect = new SQLiteConnection(MainPage.dbLocation);
public TermPage(int termId)
{
InitializeComponent();
ButtonAdd();
Term myTerm = MainPage.termList[termId - 1];
currentTerm = myTerm;
termName.Text = currentTerm.termName;
}
private void ButtonAdd()
{
Button deleteTermButton = new Button()
{
Text = "Delete Term",
BackgroundColor = Colors.Red,
FontAttributes = FontAttributes.Bold,
};
deleteTermButton.Clicked += void (sender, args) => actionDeleteTerm();
TermPageView.Children.Add(deleteTermButton);
}
public async void actionDeleteTerm()
{
dbConnect.Delete(currentTerm);
MainPage.db_refresh();
await Navigation.PopAsync();
}
Вот класс, который добавляет новый термин:

Код: Выделить всё

public class dbActions
{
public static void initiateDbTables()
{
var dbLocation = Path.Combine(FileSystem.AppDataDirectory, "MyData.db");
var dbConnect = new SQLiteConnection(dbLocation);
dbConnect.CreateTable();
}
public static void addNewDbTerm()
{
var dbConnect = new SQLiteConnection(MainPage.dbLocation);
var dbQuery = dbConnect.Query($"SELECT * FROM Terms ORDER BY termId DESC LIMIT 1");
if (dbQuery.Count != 0)
{
Term topTerm = dbQuery.First();
string termName = "Term " + (topTerm.termId + 1).ToString();
Term newTerm = new Term(termName, DateTime.Now, DateTime.Now.AddDays(60));
dbConnect.Insert(newTerm);
MainPage.db_refresh();
}
else
{
Term newTerm = new Term("Term1", DateTime.Now, DateTime.Now.AddDays(60));
dbConnect.Insert(newTerm);
MainPage.db_refresh();
}
}
}
Я пытался использовать termList.Clear() для обновления индекса, но не уверен, что это правильный подход.

Подробнее здесь: https://stackoverflow.com/questions/781 ... ites-table
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»