初次見面C#排坑記錄

排一次開發C#遇到的坑,同時說一下本身對C#中文件夾構建方式的體會。html

一個開發Java的人留下了痛苦的淚水,變量命名規則不同,連括號打的都不同,😔mysql

C#中的解決方案<>Java中的項目linux

C#中的項目<>Java中的包sql

本篇文章若有不對的地方,歡迎在評論下方留言,或者私信博主。畢竟第一次開發C#,本身都有點懵逼/(ㄒoㄒ)/~~。數據庫

C#WPF線程更新控件

在數據進行更新的頁面交互中,咱們確定會將數據更新的函數邏輯放到線程中去,由於數據請求是一個耗時的操做,相信沒有誰願意讓本身的頁面隔一段時間卡一下。But,若是咱們直接在線程中對控件進行修改,會出現這樣一個錯誤c#

 

爲何呢?windows

由於在C#中,非UI線程是不能修改UI控件的。那麼若是咱們必定要修改控件應該怎麼辦呢?很簡單,將UI修改的函數交給UI線程去作就好了。ide

this.Dispatcher.BeginInvoke(new Action(()=>change()));// change()表明控件修改的函數

C#進行數據綁定,數據更新成功,可是控件更新失敗

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的控件名字
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#開發的坑吧。

相關文章
相關標籤/搜索