ゼロからはじめるVisual C#日記.4 (SQLite導入とか)

前の日記
ゼロからはじめるVisual C#日記.3 (TextBoxとか)

少しずつでも更新していくという意志。
リングフィットがほしい。抽選販売当たってくれ~~~たのむ~~~~

ページ追加

今更ページ追加して処理の流れを変えます。見切り発車して後から色々変えることが多すぎるのでここは改善したい。
借りるときに元々学生証を読み取るページに遷移していましたが、機材を実習などの班に一つだけ貸すという方式なので、班を入力する必要があり、今貸している班も分かる必要があるのでそのためのページを作成。名前はSelectTeam。てきとうすぎるけど一人で作ってるし多分ok。
これから書くデータベース処理もやった後のスクショ。

画像3

SQLite導入

NuGet君のおかげでラクラクできた。

ソリューションエクスプローラー内の「参照」を右クリックして「NuGetパッケージの管理」を選択して、System.Data.SQLiteをインストール。

画像2

おわり。

プログラム側からデータベース作成とかするのがめんどくさかったのでPupSQLiteというアプリでデータベースを作っちゃいます。

画像3

とりあえず貸出中の機材を保存しておくデータベースを作って、仮のデータを入れました。楽~

データベースから表を作る

表を作るのにDataGridを使います。正直調べてもよく分からんかった。

SelectTeam.xaml

<DataGrid Grid.Column="0" Grid.Row="1"
         Name="Grid" Margin="0,0,0,0"
         HorizontalAlignment="Center" FontSize="18"
         ItemsSource="{Binding}"
         IsReadOnly="True" CanUserResizeColumns="False" AutoGenerateColumns="False">
   <DataGrid.Columns>
       <DataGridTextColumn Header="機材" Binding="{Binding _Equipment}" />
       <DataGridTextColumn Header="授業科目" Binding="{Binding _Class}" />
       <DataGridTextColumn Header="曜日・時限" Binding="{Binding _Period}" />
       <DataGridTextColumn Header="班" Binding="{Binding _Team}" />
   </DataGrid.Columns>
</DataGrid>

デフォルトだとアプリから表を編集できるっぽいので、IsReadOnly="true"したらいい感じ。カラムのヘッダーを指定したりするときはAutoGenerateColumns="False"をお忘れなく。

SelectTeam.xaml.cs

private string[] Day = { "日", "月", "火", "水", "木", "金", "土" };
private void CreateGrid()
{
   ObservableCollection<Lending> LendingList = new ObservableCollection<Lending>();
   using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + db_file))
   {
       conn.Open();
       SQLiteCommand cmd = conn.CreateCommand();
       cmd.CommandText = "SELECT * FROM Lend";
       using (SQLiteDataReader reader = cmd.ExecuteReader())
       {
           while (reader.Read())
           {
               LendingList.Add(new Lending()
               {
                   _Equipment = reader["EquipmentNumber"].ToString(),
                   _Class = reader["Class"].ToString(),
                   _Period = Day[int.Parse(reader["Day"].ToString())].ToString() + "曜" 
                             + reader["Period"].ToString() + "限",
                   _Team =  reader["Team"].ToString() + "班"
               });
           }
       }
       conn.Close();
   }
   this.Grid.DataContext = LendingList;
}
public class Lending
{
   public string _Equipment { get; set; }
   public string _Class { get; set; }
   public string _Period { get; set; }
   public string _Team { get; set; }
}

string[] Day は別の場所でも使ってるので関数外に置いてます。たぶん楽。
後はいつものやつ

private ObservableCollection<Clct> _day = new ObservableCollection<Clct>();
public SelectTeam()
{
   InitializeComponent();
   for (int i = 0; i < 7; i++)
   {
       _day.Add(new Clct { Id = i.ToString(), Name = Day[i] });
   }
   DayComboBox.ItemsSource = _day;
   DayComboBox.SelectedItem = _day.Where(p => p.Id == "1").First();
   CreateGrid();
   ActiveForm(false);
}
private void BoxChecked(object sender, RoutedEventArgs e)
{
   ActiveForm(true);
   CheckForm(null, null);
}
private void BoxUnChecked(object sender, RoutedEventArgs e)
{
   ActiveForm(false);
   NextButton.IsEnabled = true;
}
private void ActiveForm(bool b)
{
   TextBoxClass.IsReadOnly = !b; TextBoxClass.IsEnabled = b;
   DayComboBox.IsReadOnly = !b; DayComboBox.IsEnabled = b;
   TextBoxPeriod.IsReadOnly = !b; TextBoxPeriod.IsEnabled = b;
   TextBoxTeam.IsReadOnly = !b; TextBoxTeam.IsEnabled = b;
}
private void CheckForm(object sender, TextChangedEventArgs e)
{
   bool formclass = (TextBoxClass.Text.Length > 0);
   bool period = Regex.IsMatch(TextBoxPeriod.Text, "[1-9]{1}");
   bool team = (TextBoxTeam.Text.Length > 0);
   if (formclass && period && team)
       NextButton.IsEnabled = true;
   else
       NextButton.IsEnabled = false;
}

Gakubuクラスを名前だけClctにしてます。
イベントで呼び出される関数にnull渡して呼び出すのってアリなのかな...
ダメな気はする。

さいごに

思ったより時間かかるしコツコツやるのは大事ですね。(一か月放置してた並感)

次の日記
ゼロからはじめるVisual C#日記.5 (データベースとか色々手直しとか)

この記事が気に入ったらサポートをしてみませんか?