- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google 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!