Добрый день! Начинаю изучать c#, сказали, что лучшее обучение в практике, вот и практикуюсь
Изучал SQLite, столкнулся с такой проблемой: не удаётся передать параметры из фрейма в фрейм (xaml). Код следующий:
Главная страница
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| namespace SQLiteApp
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
}
protected override void OnNavigatedTo(NavigationEventArgs m)
{
Base _base = new Base();
name_Block.Text = _base.Name; //name_Block - поле TextBlock на xaml
BasePWD.Password = _base.PWD.ToString(); //BasePWD - поле PasswordBox на xaml
}
private void btnChooseDB(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(SQLiteDataBase));
}
}
} |
|
Страница с методами и классом Base
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
| namespace SQLiteApp
{
public class Base
{
public long Id { get; set; }
public string Name { get; set;}
public string DataBase { get; set; }
public string PWD { get; set; }
}
public sealed partial class SQLiteDataBase : Page
{
public SQLiteDataBase()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
basesList.ItemsSource = App.repo.GetBases();
}
private void ItemView_ItemClick(object sender, ItemClickEventArgs e)
{
var itemId = ((Base)e.ClickedItem).Id;
Frame.Navigate(typeof(DetailsPage), itemId);
}
private void createButton_Click(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(AddPage));
}
private void btn_click_back(object sender, RoutedEventArgs e)
{
Frame.Navigate(typeof(MainPage));
}
}
public class BaseRepository
{
public SQLiteConnection con;
public BaseRepository(string dbname)
{
this.con = new SQLiteConnection(dbname);
}
public void CreateTable()
{
string sql = "CREATE TABLE IF NOT EXISTS Base (Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Name VARCHAR(100), DataBase VARCHAR(100), PWD VARCHAR(100))";
using (var statement = con.Prepare(sql))
{
statement.Step();
}
}
public void Insert(Base basesql)
{
using (var statement = con.Prepare("INSERT INTO Base(Name, DataBase, PWD) VALUES (?,?,?)"))
{
statement.Bind(1, basesql.Name);
statement.Bind(2, basesql.DataBase);
statement.Bind(3, basesql.PWD);
statement.Step();
}
}
public ObservableCollection<Base> GetBases()
{
ObservableCollection<Base> bases = new ObservableCollection<Base>();
using (var statement = con.Prepare("SELECT Id, Name, DataBase, PWD FROM Base"))
{
while (statement.Step() == SQLiteResult.ROW)
{
Base basesql = new Base();
basesql.Id = (long)statement[0];
basesql.Name = (string)statement[1];
basesql.DataBase = (string)statement[2];
basesql.PWD = (string)statement[3];
bases.Add(basesql);
}
}
return bases;
}
public Base GetBase(long id)
{
Base basesql = null;
using (var statement = con.Prepare("SELECT Id, Name, DataBase, PWD FROM Base WHERE Id=?"))
{
statement.Bind(1, id);
if (statement.Step() == SQLiteResult.ROW)
{
basesql = new Base();
basesql.Id = (long)statement[0];
basesql.Name = (string)statement[1];
basesql.DataBase = (string)statement[2];
basesql.PWD = (string)statement[3];
}
}
return basesql;
}
public void Update(Base basesql)
{
using (var statement = con.Prepare("UPDATE Base SET Name=?, DataBase=?, PWD=? WHERE Id=?"))
{
statement.Bind(1, basesql.Name);
statement.Bind(2, basesql.DataBase);
statement.Bind(3, basesql.PWD);
statement.Bind(4, basesql.Id);
statement.Step();
}
}
public void Delete(long id)
{
using (var statement = con.Prepare("DELETE FROM Base WHERE Id=?"))
{
statement.Bind(1, id);
statement.Step();
}
}
}
} |
|
Код страницы, откуда хочу передать данные
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| namespace SQLiteApp
{
sealed partial class DetailsPage : Page
{
public DetailsPage()
{
this.InitializeComponent();
}
public long Id { get; set; }
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.Parameter != null)
{
long id = (long)e.Parameter;
Base b = App.repo.GetBase(id);
if(b!=null)
{
nameBlock.Text = b.Name;
DataBaseBlock.Text = b.DataBase;
PWDBlock.Text = b.PWD.ToString();
deleteButton.IsEnabled = true;
Choose_DB.IsEnabled = true;
Id = id;
}
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Button button = (Button)sender;
if(button.Name=="deleteButton")
App.repo.Delete(Id);
if (Frame.CanGoBack)
Frame.GoBack();
}
private void btn_choose_DB(object sender, RoutedEventArgs m)
{
Frame.Navigate(typeof(MainPage));
}
}
} |
|
Когда запускаю проверить работоспособность, выводит исключение на главной странице в строке "name_Block.Text = _base.Name;", само исключение : "Value cannot be null". Пробовал исправить через try-catch, пробовал подставлять данные в {get;set;}, всё без толку. Хотел сам разобраться, уверен, что что-то здесь очень простое, но уже 3ю неделю не могу понять что...
Если про что забыл упомянуть, готов ответить на вопросы
Заранее спасибо, если направите на правильный путь. Если нужно, могу скинуть файлы всей программы в архиве.