初次见面C#排坑记录

排一次开发C#遇到的坑,同时说一下自己对C#中文件夹构建方式的体会。

一个开发Java的人留下了痛苦的泪水,变量命名规则不一样,连括号打的都不一样,??

C#中的解决方案<>Java中的项目

C#中的项目<>Java中的包

本篇文章如有不对的地方,欢迎在评论下方留言,或者私信博主。毕竟第一次开发C#,自己都有点懵逼/(ㄒoㄒ)/~~。

C#WPF线程更新控件

在数据进行更新的页面交互中,我们肯定会将数据更新的函数逻辑放到线程中去,因为数据请求是一个耗时的操作,相信没有谁愿意让自己的页面隔一段时间卡一下。But,如果我们直接在线程中对控件进行修改,会出现这样一个错误

初次见面C#排坑记录

 

为什么呢?

因为在C#中,非UI线程是不能修改UI控件的。那么如果我们一定要修改控件应该怎么办呢?很简单,将UI修改的函数交给UI线程去做就行了。

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后,使用命令行能够进去,如下图所示:

初次见面C#排坑记录

 

当是,一旦我使用数据库可视化工具,进行数据库连接就出现了以下的问题:(我使用的是DataGrip可视化工具,不确定其他数据库可视化工具会不会遇到这个坑),然后发现死活连接不上。

初次见面C#排坑记录

 

后面google了一下:发现我们的URL需要这样连接

jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

这样的话,我们就可以开开心心的使用数据库可视化工具了。

这篇博客持续更新,慢慢的排C#开发的坑吧。

初次见面C#排坑记录

上一篇:[Windows事件管理器]安全审核的文档


下一篇:Windows平台下Git服务器搭建