排一次開發C#遇到的坑,同時說一下本身對C#中文件夾構建方式的體會。html
一個開發Java的人留下了痛苦的淚水,變量命名規則不同,連括號打的都不同,😔mysql
C#中的解決方案<>Java中的項目linux
C#中的項目<>Java中的包sql
本篇文章若有不對的地方,歡迎在評論下方留言,或者私信博主。畢竟第一次開發C#,本身都有點懵逼/(ㄒoㄒ)/~~。數據庫
在數據進行更新的頁面交互中,咱們確定會將數據更新的函數邏輯放到線程中去,由於數據請求是一個耗時的操做,相信沒有誰願意讓本身的頁面隔一段時間卡一下。But,若是咱們直接在線程中對控件進行修改,會出現這樣一個錯誤c#
爲何呢?windows
由於在C#中,非UI線程是不能修改UI控件的。那麼若是咱們必定要修改控件應該怎麼辦呢?很簡單,將UI修改的函數交給UI線程去作就好了。ide
this.Dispatcher.BeginInvoke(new Action(()=>change()));// change()表明控件修改的函數
TextBlock控件進行綁定的代碼以下:函數
// 建立一個TextBlock控件
TextBlock block = new TextBlock();
// 對象字典
private Dictionary<string,SensorDataDao> controllerDataDictionary = new Dictionary<string, SensorDataDao>();
// 進行數據綁定
BindingOperations.SetBinding(block, TextBlock.TextProperty, new Binding()
{
// controllerDataDictionary[tagApi]爲綁定的對象
Source = controllerDataDictionary[tagApi],
// 被綁定對象的屬性
Path = new PropertyPath("Name"),
// 綁定的方式
Mode = BindingMode.TwoWay,
});
綁定對象的類:工具
剛開始我建立類的時候,我忘記繼承INotifyPropertyChanged
這個類了,若是咱們不繼承這個類,數據綁定不會失敗,也就是說,TextBlock的Text內容仍然會顯示,可是你進行改變的時候,Text內容並不會進行改變。
using System;
using System.ComponentModel;
namespace DataDao
{
public class SensorDataDao:INotifyPropertyChanged
{
private string _Name;
public string Name
{
set
{
if (value == _Name) return;
_Name = value;
Notify("Name");
}
get => _Name;
}
public event PropertyChangedEventHandler PropertyChanged;
public void Notify(string propertyName) {
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
接下來就是我遇到的問題,當我進行wpf 數據綁定的時候,PropertyChanged一直爲空,而TextBlock的Text內容也沒發生改變,但是個人數據已經改變了(不得不說Visual studio debug模式真香)。
個人數據進行該改變的函數是這樣的:
controllerDataDictionary[ApiTag] = new SensorDataDao
{
Name = "新的名字",
};
原本我以爲沒什麼問題的,當是冥冥中,我忽然想到,爲何控件進行數據綁定後,會隨着數據發生改變呢?是否是由於控件綁定的是對象的內存地址呢(以上是我猜想的,不肯定對不對)?但是在上面的更改中,咱們能夠明顯的知道,咱們進行數據更新是創造了一個新的對象,並非原先的對象,因此TextBlock綁定的仍是原先的對象,值並無進行改變。
因此咱們須要這樣作:
controllerDataDictionary[ApiTag].Name = "新的名字";
這個控件進行綁定的對象就進行修改了。
在上一步咱們說了綁定的內容,可是在DataGrid控件中,彷彿就不生效了,即便DataGrid綁定了內容,內容在線程數據進行更新,可是顯示的數據卻並無進行更新。真的是我有橘麻麥皮不知當槳不當槳。
直接給解決方法了:
// 在線程中刷新數據,其中dataGrid爲DataGrid的控件名字
dataGrid.Dispatcher.BeginInvoke(new Action(() => dataGrid.Items.Refresh()));
由於我一直用的是linux進行開發,因此這一次用windows開發的時候遇到了數據鏈接的問題。
在我安裝好mysql後,使用命令行可以進去,以下圖所示:
當是,一旦我使用數據庫可視化工具,進行數據庫鏈接就出現瞭如下的問題:(我使用的是DataGrip可視化工具,不肯定其餘數據庫可視化工具會不會遇到這個坑),而後發現死活鏈接不上。
後面google了一下:發現咱們的URL須要這樣鏈接
jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
這樣的話,咱們就能夠開開心心的使用數據庫可視化工具了。
這篇博客持續更新,慢慢的排C#開發的坑吧。