初次见面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#开发的坑吧。

相关文章
相关标签/搜索