- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# Winform
[DEVEXPRESS] Sử dụng RealTimeSource để đọc dữ liệu theo thời gian thực vào Gridview C#
Xin chào các bạn, bài viết hôm nay mình tiếp tục hướng dẫn các bạn cách sử dụng RealTimeSource vào gridview Devexpress để tải dữ liệu theo thời gian thực.
[DEVEXPRESS] Load data RealTime to GridView using RealTimeSource C#
Dưới đây, là hình ảnh demo ứng dụng:
Ở bài viết demo này, mình sử dụng NodeJs để tạo 1 server sử dụng Socket.IO để truyền dữ liệu liên tục về cho Winform.
Chi tiết các bạn, có thể tham khảo ở Video demo:
Source code Node JS:
const ex = require('express');
const router = ex.Router();
var exServer = require('http').createServer(ex)
exServer.listen(1500)
console.log("Server running at 127.0.0.1:1500");
var server = require("socket.io").Server
var socketIO = new server(exServer)
var generateNumber = function (min, max) {
if (min > max) {
throw new Error('Minimum value should be smaller than maximum value.');
}
var range = max - min;
var result = (min + range * Math.random());
return Number.parseFloat(result).toFixed(2);
};
socketIO.on("connect", (socketConnection) => {
socketConnection.on('send', function (timeout) {
console.log(timeout);
setInterval(function () {
var randomData = function (name) {
const timestamp = Date.now() ;
return { Currency: name, Rate: generateNumber(1.0, 2.0), Bid: generateNumber(1.0, 2.0), Ask: generateNumber(1.0, 2.0), High: generateNumber(1.0, 2.0), Low: generateNumber(1.0, 2.0), Open: generateNumber(1.0, 2.0), Close: generateNumber(1.0, 2.0), TimeStamp: timestamp};
}
var sampleData = [];
sampleData.push(randomData("VND/USD"));
sampleData.push(randomData("VND/GBP"));
sampleData.push(randomData("USD/EUR"));
sampleData.push(randomData("JPY/USD"));
sampleData.push(randomData("GDP/JPY"));
sampleData.push(randomData("CAD/USD"));
sampleData.push(randomData("USD/CHF"));
sampleData.push(randomData("JPY/CHF"));
sampleData.push(randomData("USD/CAD"));
socketConnection.send(JSON.stringify(sampleData));
console.log(sampleData);
}, timeout);
})
})
Ở server này, sẻ trả cho chúng ta dữ liệu tỷ giá theo thời gian thực, số liệu thì mình random nhé.
Và ở dưới Winform chúng ta sẻ Connect và đọc dữ liệu liên tục lên Gridview C#.
Trên C#, các bạn cần cài đặt thư viện Socket.IO từ nuget.
PM> NuGetInstall-Package SocketIOClient -Version 3.0.7-alpha.1
Full source code C#:
using DevExpress.ClipboardSource.SpreadsheetML;
using DevExpress.Data;
using DevExpress.XtraGrid.Views.Grid;
using Newtonsoft.Json;
using SocketIOClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
namespace RealTimeData
{
public partial class Form1 : DevExpress.XtraEditors.XtraForm
{
public Form1()
{
InitializeComponent();
}
BindingList<DataExchange> listDataExchange;
private void Form1_Load(object sender, EventArgs e)
{
gridView1.OptionsMenu.ShowConditionalFormattingItem = true;
lblSpeed.Text = "Speed: " + trackBarControl1.Value + " ms";
listDataExchange = new BindingList<DataExchange>();
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
listDataExchange.Add(new DataExchange());
RealTimeSource rts = new RealTimeSource()
{
DataSource = listDataExchange
};
gridControl1.DataSource = rts;
this.FormClosing += Form1_FormClosing;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (client != null) {
if (client.Connected)
{
client.DisconnectAsync();
}
}
}
SocketIO client;
private async void simpleButton1_Click(object sender, EventArgs e)
{
}
private async void trackBarControl1_EditValueChanged(object sender, EventArgs e)
{
if(client!= null) {
await client.DisconnectAsync();
await client.ConnectAsync();
}
lblSpeed.Text = "Speed: " + trackBarControl1.Value + " ms";
}
}
public class DataExchange: INotifyPropertyChanged
{
private string _Currency;
private double _Rate;
public double _Bid;
public double _Ask;
public double _High;
public double _Low;
public double _Open;
public double _Close;
public long _TimeStamp;
public string Currency
{
get
{
return _Currency;
}
set
{
_Currency = value;
NotifyPropertyChanged("Currency");
}
}
public double Rate
{
get
{
return _Rate;
}
set
{
_Rate = value;
NotifyPropertyChanged("Rate");
}
}
public double Bid
{
get
{
return _Bid;
}
set
{
_Bid = value;
NotifyPropertyChanged("Bid");
}
}
public double Ask
{
get
{
return _Ask;
}
set
{
_Ask = value;
NotifyPropertyChanged("Ask");
}
}
public double High
{
get
{
return _High;
}
set
{
_High = value;
NotifyPropertyChanged("High");
}
}
public double Low
{
get
{
return _Low;
}
set
{
_Low = value;
NotifyPropertyChanged("Low");
}
}
public double Open
{
get
{
return _Open;
}
set
{
_Open = value;
NotifyPropertyChanged("Open");
}
}
public double Close
{
get
{
return _Close;
}
set
{
_Close = value;
NotifyPropertyChanged("Close");
}
}
public long TimeStamp
{
get
{
return _TimeStamp;
}
set
{
_TimeStamp = value;
NotifyPropertyChanged("TimeStamp");
}
}
public event PropertyChangedEventHandler PropertyChanged;
void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
Thanks for watching!