期货交易报表窗体(TFrmReport),核心功能是从后端接口获取四类交易数据(业绩、平仓、流水、成交),并展示在对应的 DataGridView 控件中。窗体支持按时间范围筛选数据,切换标签页时自动加载对应数据,也可通过按钮手动刷新。
核心模块拆解与关键说明
1. 数据存储与初始化
// 定义四类核心数据的存储列表
public List<ST_PingCang_Info> mListPingCang = new List<ST_PingCang_Info> ();
public List<ST_YeJiInfo> mListYeJi = new List<ST_YeJiInfo> ();
public List<ST_LiuShuiInfo> mListLiuShui = new List<ST_LiuShuiInfo>();
public List<ST_Trade_Info> mListTrade = new List<ST_Trade_Info>();
// 窗体构造函数:初始化时间控件为近7天,并默认加载业绩数据
public TFrmReport()
{
InitializeComponent();
DateTime dtTime1 = DateTime.Now.AddDays(-7);
DateTime dtTime2 = DateTime.Now;
// 给所有时间筛选控件赋值
dtpBeginYeJi.Value = dtTime1;
dtpEndYeJi.Value = dtTime2;
// ... 其他时间控件赋值
this.GetYeJiReport(); // 加载业绩数据
}
- 关键说明 :
ST_PingCang_Info/ST_YeJiInfo等是自定义结构体 / 类,用于封装对应业务数据;时间控件默认展示近 7 天数据。
2. 标签页切换逻辑
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
int selIndex = tabControl1.SelectedIndex;
if (selIndex == 0) this.GetYeJiReport(); // 业绩标签
else if (selIndex == 1) this.GetFlatReport(); // 平仓标签
else if (selIndex == 2) this.GetLiuShuiReport(); // 流水标签
else if (selIndex == 3) this.GetTradeReport(); // 成交标签
}
- 关键说明:切换标签页时自动加载对应数据,提升用户体验。
3. 核心:接口请求
private void GetYeJiReport()
{
mListYeJi.Clear(); // 清空旧数据
// 1. 处理时间参数:转换为时间戳
string strBegin = dtpBeginYeJi.Value.ToShortDateString();
string strEnd = dtpEndYeJi.Value.ToShortDateString();
long lBeginTime = Utils.TimeStringToTimeStamp(strBegin + " 00:00:00");
long lEndTime = Utils.TimeStringToTimeStamp(strEnd + " 23:59:59");
try
{
// 2. 构造请求参数(用户信息+时间范围)
JObject joParam = new JObject();
joParam.Add("UserID", Common.gMeInfo.nUserID.ToString());
joParam.Add("Password", Common.gMeInfo.cMd5Password);
joParam.Add("Token", Common.gMeInfo.cToken);
joParam.Add("BeginTime", lBeginTime);
joParam.Add("EndTime", lEndTime);
// 3. 发送 POST 请求(JSON 格式)
string url = Common.http_url + "getYeJiReport";
string response = Http.HttpPostJson(url, joParam.ToString());
// 4. 解析 JSON 响应
JObject json = JObject.Parse(response);
if (json["code"].ToString() != "0") return; // 接口返回非成功码,直接返回
if (int.Parse(json["data"]["rowcount"].ToString()) == 0) return; // 无数据
// 5. 遍历数据并封装到实体列表
JArray jaData = (JArray)json["data"]["row"];
for (int i = 0; i < jaData.Count(); i++)
{
ST_YeJiInfo yjInfo = new ST_YeJiInfo();
yjInfo.baseMoney = float.Parse(jaData[i]["baseMoney"].ToString());
// ... 其他字段赋值
mListYeJi.Add(yjInfo); // 添加到列表
}
this.UpdateYeJiData(); // 更新界面展示
}
catch(Exception ex)
{
Common.ShowMsg("获取业绩失败"); // 异常提示
}
}
- 关键说明 :
- 所有接口请求逻辑一致:构造参数 → 发送 POST → 解析 JSON → 封装数据 → 更新界面;
- 接口鉴权:携带 UserID/Password/Token。
4. 界面数据渲染
private void UpdatePingCangData()
{
dataGridView_FlatRecord.Rows.Clear(); // 清空表格
foreach(var node in mListPingCang)
{
// 1. 枚举值转换(如 1=平空,2=平多)
string oplb = "";
if (node.buySell == 1) oplb = "平空";
else if (node.buySell == 2) oplb = "平多";
// 2. 时间戳转换为可读时间
string cjTime = Utils.TimeStampToTimeString(node.time);
// 3. 新增行并赋值
int rowindex = dataGridView_FlatRecord.Rows.Add();
DataGridViewRow row = dataGridView_FlatRecord.Rows[rowindex];
row.Tag = node; // 行绑定原始数据(方便后续操作)
row.Cells["colPingCang_GoodsName"].Value = node.goodname.ToString();
row.Cells["colPingCang_lb"].Value = oplb;
// ... 其他列赋值
}
}
. 手动刷新按钮逻辑
private void btnOKYeJi_Click(object sender, EventArgs e)
{
GetYeJiReport(); // 点击"查询业绩"按钮,重新加载业绩数据
}
// 平仓/流水/成交按钮逻辑一致
- 关键说明:按钮点击事件直接调用对应的 "获取数据" 方法,实现手动刷新。
