実現したいこと
public partial class Func1100 : ContentPage
{
public ObservableCollection<Commonクイズ> QuizItems = new ObservableCollection<Commonクイズ>();
の変数に、データを読み込んでいるつもりだが、なぜかカウントしてもゼロのまま
QuizItems にデータベースの内容をセットしたい。
発生している問題・分からないこと
データベースで例外は発生していない。
処理は、想定している全部の処理を、正常に処理しているように見える。
それでいて、なぜか 変数 QuizItems にはデータが読み込まれない。
該当のソースコード
XAML
1// Filename: Func1100.xaml 2 3<?xml version="1.0" encoding="utf-8" ?> 4<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" 5 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 6 x:Class="MauiApp_2025_07_20_問題の入力ツール.Func1100" 7 Title="Func1100"> 8 <VerticalStackLayout> 9 <Label 10 Text="Welcome to .NET MAUI!" 11 VerticalOptions="Center" 12 HorizontalOptions="Center" /> 13 14 <Label 15 Text="問題を作成しますか?編集しますか?" /> 16 17 <Button 18 Text="問題を作成する" 19 Clicked="OnButton_問題を作成する" /> 20 21 <!-- クイズリストのタイトル --> 22 23 <!-- データベースから読み込んだクイズの一覧を表示する --> 24 <!-- ItemSourceにC#のObservableCollectionをバインド --> 25 <CollectionView x:Name="QuizCollectionView" 26 ItemsSource="{Binding QuizItems}" 27 Margin="0,20,0,0"> 28 <CollectionView.ItemTemplate> 29 <DataTemplate> 30 <!-- シンプルなLabelで各アイテムを表示 --> 31 <Label Text="{Binding 問題}" 32 FontSize="16" 33 Margin="5,0" /> 34 </DataTemplate> 35 </CollectionView.ItemTemplate> 36 </CollectionView> 37 38 <Button 39 Text="問題を編集する" 40 Clicked="OnButton_問題を編集する" /> 41 42 </VerticalStackLayout> 43</ContentPage>
C#
1// Filename: Func1100.cs 2 3using Microsoft.Maui.Controls; 4using System.Collections.ObjectModel; 5using System.Diagnostics; 6using System.Linq; 7 8namespace MauiApp_2025_07_20_問題の入力ツール; 9 10public partial class Func1100 : ContentPage 11{ 12 public ObservableCollection<Commonクイズ> QuizItems = new ObservableCollection<Commonクイズ>(); 13 14 public Func1100() 15 { 16 InitializeComponent(); 17 //問題一覧を作成して表示する(); 18 // このページにバインディングコンテキストを設定 19 this.BindingContext = this; 20 21 Common.データベースの読み込み_Func1100(ref QuizItems); 22 Debug.WriteLine("デバック Func1100 - OK"); 23 // QuizItemsの要素数を数える 24 int quizCount = QuizItems.Count; 25 // デバッグ出力で要素数を表示 26 Debug.WriteLine($"読み込まれたクイズの数: {quizCount}"); 27 } 28 29 30 private void OnButton_問題を作成する(object? sender, EventArgs e) 31 { 32 Navigation.PushAsync(new Func1200()); 33 } 34 private void 問題一覧を作成して表示する() 35 { 36 // クイズデータのリストから「問題」の文字列だけを抽出 37 var quizQuestions = Common.m_tクイズ古代.Select(q => q.問題文).ToArray(); 38 39 // 表示する文字列を整形する 40 string message = string.Join("\n\n", quizQuestions); 41 42 // データベースの内容をアラートダイアログで表示 43 DisplayAlert( 44 "クイズリスト", // ダイアログのタイトル 45 message, // 表示するメッセージ 46 "OK"); // OKボタンのテキスト 47 } 48 private void OnButton_問題を編集する(object? sender, EventArgs e) 49 { 50 } 51 private void OnButton_終了する(object? sender, EventArgs e) 52 { 53 Application.Current!.Quit(); 54 } 55} 56
C#
1// Common.cs 2 3using Microsoft.Data.Sqlite; 4using Microsoft.Maui.ApplicationModel.DataTransfer; 5using System; 6using System; 7using System.Collections.Generic; 8using System.Collections.ObjectModel; 9using System.Diagnostics; 10using System.Linq; 11using System.Text; 12using System.Threading.Tasks; 13 14namespace MauiApp_2025_07_20_問題の入力ツール 15{ 16 public static class Common 17 { 18 public static string? ms_str選んだ時代; 19 public static string? m_szConnectionString = "Data Source=D:\\OneDrive_2025_07_18\\DB-software\\japanese_history.sqlite3"; 20 public static List<Commonクイズ> m_tクイズ古代 = new List<Commonクイズ>(); 21 public static List<Commonクイズ> m_tクイズ中世 = new List<Commonクイズ>(); 22 public static List<Commonクイズ> m_tクイズ近世 = new List<Commonクイズ>(); 23 public static List<Commonクイズ> m_tクイズ近代_前半 = new List<Commonクイズ>(); 24 public static List<Commonクイズ> m_tクイズ近代_後半 = new List<Commonクイズ>(); 25 public static List<Commonクイズ> m_tクイズ現代 = new List<Commonクイズ>(); 26 27 28 public static void データベースの読み込み_Func1100( ref ObservableCollection<Commonクイズ> list ) 29 { 30 // ObservableCollectionからListに変換 31 List<Commonクイズ> quizList = list.ToList(); 32 33 // 変換したListを引数に渡して、データの読み込みを行う 34 データベースデータの読み込み_古文(ref quizList); 35 } 36 public static void データベースの読み込み_全部() 37 { 38 // SQL と、変数が変わる 39 データベースデータの読み込み_古文(ref m_tクイズ古代); 40 データベースデータの読み込み_古文(ref m_tクイズ中世); 41 データベースデータの読み込み_古文(ref m_tクイズ近世); 42 データベースデータの読み込み_古文(ref m_tクイズ近代_前半); 43 データベースデータの読み込み_古文(ref m_tクイズ近代_後半); 44 データベースデータの読み込み_古文(ref m_tクイズ現代); 45 } 46 // 問題ID:古文 10000 - 19999 47 private static void データベースデータの読み込み_古文( ref List<Commonクイズ> 初期化変数 ) 48 { 49 // クイズをデータベースから読みだす 50 // WHERE 目次 BETWEEN 50101 AND 50110 51 string str_sql = "SELECT ID, 時代, 問題ID, 問題文, 選択肢1, 選択肢2, 選択肢3, 選択肢4, 解説, 答え, 作成日 FROM クイズテーブル"; 52 53 // SqliteConnectionオブジェクトを作成 54 using (var connection = new SqliteConnection(m_szConnectionString)) 55 { 56 try 57 { 58 // データベースに接続 59 connection.Open(); 60 61 // データを取得するSQLクエリ 62 using (var command = connection.CreateCommand()) 63 { 64 command.CommandText = str_sql; 65 66 using (var reader = command.ExecuteReader()) 67 { 68 while (reader.Read()) 69 { 70 // 各列の値を取得し、クイズクラスのインスタンスを作成 71 Commonクイズ quiz = new Commonクイズ 72 { 73 ID = reader.GetInt32(0), // ID 74 時代 = reader.GetString(1), 75 問題ID = reader.GetInt32(2), 76 問題文 = reader.GetString(3), 77 選択肢1 = reader.GetString(4), 78 選択肢2 = reader.GetString(5), 79 選択肢3 = reader.GetString(6), 80 選択肢4 = reader.GetString(7), 81 解説 = reader.GetString(8), 82 答え = reader.GetString(9), 83 作成日 = reader.GetString(10) 84 }; 85 86 Debug.WriteLine($"ID:{quiz.ID} 時代:{quiz.時代}"); 87 // リストにRecordインスタンスを追加 88 初期化変数.Add(quiz); 89 } 90 } 91 } 92 } 93 catch (SqliteException ex) 94 { 95 // エラーメッセージを表示 96 Debug.Write($"エラー: {ex.Message}\n"); 97 } 98 finally 99 { 100 // `using`ステートメントを使用しているため、connection.Close()は不要です。 101 // usingブロックを抜けると自動的にリソースが解放されます。 102 } 103 Debug.WriteLine("デバック データベースの読み込み完了"); 104 } 105 } 106 107 }// end Common 108 109 110} 111
C#
1// Filename: Commonクイズ.cs 2 3using System; 4using System.Collections.Generic; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8 9namespace MauiApp_2025_07_20_問題の入力ツール 10{ 11 public class Commonクイズ 12 { 13 public int ID { get; set; } 14 public string? 時代 { get; set; } 15 public int 問題ID { get; set; } 16 public string? 問題文 { get; set; } 17 public string? 選択肢1 { get; set; } 18 public string? 選択肢2 { get; set; } 19 public string? 選択肢3 { get; set; } 20 public string? 選択肢4 { get; set; } 21 public string? 解説 { get; set; } 22 public string? 答え { get; set; } 23 public string? 作成日 { get; set; } 24 } 25} 26
SQL
1// SQL テーブルの作成と 問題の作成 2 3CREATE TABLE クイズテーブル ( 4 ID INTEGER PRIMARY KEY AUTOINCREMENT, 5 問題ID INTEGER, 6 時代 TEXT, 7 問題文 TEXT, 8 選択肢1 TEXT, 9 選択肢2 TEXT, 10 選択肢3 TEXT, 11 選択肢4 TEXT, 12 解説 TEXT, 13 答え TEXT, 14 作成日 DATETIME DEFAULT CURRENT_TIMESTAMP 15); 16// drop table クイズテーブル; 17 18 19 20INSERT INTO クイズテーブル (問題ID, 時代, 問題文, 選択肢1, 選択肢2, 選択肢3, 選択肢4, 解説, 答え) VALUES 21(1, '歴史', '日本の最初の首都はどこ?', '京都', '奈良', '東京', '大阪', '710年から784年まで日本の都であった都市です。', '奈良'), 22(2, '科学', '地球上で最も豊富な元素は?', '酸素', '窒素', '水素', '鉄', '地殻の約46.6%を占めています。', '酸素'), 23(3, '地理', '世界で最も長い川は?', 'アマゾン川', 'ナイル川', '長江', 'ミシシッピ川', '南米に位置し、その長さはナイル川をわずかに上回るとされています。', 'アマゾン川'), 24
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
処理はうまく流れているのですが、データの数を確認してもゼロです。
デバック データベースの読み込み完了
デバック Func1100 - OK
読み込まれたクイズの数: 0
と、出力されます。
どこがまずいでしょうか?
文字数が9000文字を超えたので、XAMLの一部分を削っています。
補足
OS: Windows 11
CPU: x64
.NET 9.0
.NET MAUI
データベースソフト: SQLite

回答2件
あなたの回答
tips
プレビュー