You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
9.8 KiB
C#

2 years ago
using Rs.Framework;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.Remoting;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Rs.Controls
{
/// <summary>
/// 穴位偏移控件
/// </summary>
public partial class SlotOffsetCtl : UserControl
{
public event Action<int,string,double> SlotValueChanged;
public int RowNum { get; set; } = 9;
public int ColumnNum { get; set; } = 10;
public string TrayName { get; set; }
public DataTable DataSource { get; set; }
private RectangleF selectRect;
private Dictionary<int, double> xDic = new Dictionary<int, double>();
private Dictionary<int, double> yDic = new Dictionary<int, double>();
private Dictionary<int, TextBox> txtXDic = new Dictionary<int, TextBox>();
private Dictionary<int, TextBox> txtYDic = new Dictionary<int, TextBox>();
public SlotOffsetCtl()
{
InitializeComponent();
selectRect = new RectangleF();
}
private void SlotOffsetCtl_Load(object sender, EventArgs e)
{
if(ObjectHelper.IsNotNullorEmpty(DataSource))
{
foreach (DataRow dataRow in DataSource.Rows)
{
xDic.Add(int.Parse(dataRow["slotindex"].ToString()), double.Parse(dataRow["offsetx"].ToString()));
yDic.Add(int.Parse(dataRow["slotindex"].ToString()), double.Parse(dataRow["offsety"].ToString()));
}
}
tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
//tlpColHeader.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
//tlpRowHeader.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.ColumnStyles.Clear();
tlpColHeader.RowStyles.Clear();
tlpColHeader.ColumnStyles.Clear();
tlpRowHeader.RowStyles.Clear();
tlpRowHeader.ColumnStyles.Clear();
float colpercent = 100 / ColumnNum;
float rowpercent = 100 / RowNum;
tableLayoutPanel1.ColumnCount= ColumnNum;
tableLayoutPanel1.RowCount= RowNum;
tlpColHeader.ColumnCount = ColumnNum;
tlpColHeader.RowCount = 1;
tlpRowHeader.ColumnCount = 1;
tlpRowHeader.RowCount = RowNum;
for (int i=0;i<ColumnNum;i++)
{
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, colpercent));
tlpColHeader.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, colpercent));
tlpRowHeader.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100));
}
for (int i = 0; i < RowNum; i++)
{
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, rowpercent));
tlpRowHeader.RowStyles.Add(new RowStyle(SizeType.Percent, rowpercent));
tlpColHeader.RowStyles.Add(new RowStyle(SizeType.Percent, 100));
}
//添加列序号
for (int i = 0; i < ColumnNum; i++)
{
int num = i + 1;
Label lblColHeader = new Label();
lblColHeader.TextAlign = ContentAlignment.MiddleCenter;
lblColHeader.Text = num.ToString();
lblColHeader.Dock = DockStyle.Fill;
lblColHeader.AutoSize = false;
lblColHeader.ForeColor = Color.White;
tlpColHeader.Controls.Add(lblColHeader, i, 0);
}
for (int i = 0; i < RowNum; i++)
{
int num = i + 1;
Label lblRowHeader = new Label();
lblRowHeader.TextAlign = ContentAlignment.MiddleCenter;
lblRowHeader.Text = num.ToString();
lblRowHeader.Dock = DockStyle.Fill;
lblRowHeader.AutoSize = false;
lblRowHeader.ForeColor = Color.White;
tlpRowHeader.Controls.Add(lblRowHeader, 0, i);
}
int slotIndex = 0;
for (int r = 0; r < RowNum; r++)
{
for (int c = 0; c < ColumnNum; c++)
{
slotIndex += 1;
TableLayoutPanel tableLayoutPanel= new TableLayoutPanel();
tableLayoutPanel.Dock = DockStyle.Fill;
tableLayoutPanel.RowCount = 2;
tableLayoutPanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
tableLayoutPanel.RowStyles.Clear();
tableLayoutPanel.ColumnStyles.Clear();
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 50));
TextBox txtOffsetX = new TextBox();
txtOffsetX.TextAlign = HorizontalAlignment.Center;
txtOffsetX.Size = new Size(50, 30);
if(xDic.ContainsKey(slotIndex))
{
txtOffsetX.Text = xDic[slotIndex].ToString("0.000");
}
else
{
txtOffsetX.Text = "0";
}
txtXDic.Add(slotIndex, txtOffsetX);
txtOffsetX.Font = new Font("宋体", 9);
txtOffsetX.ForeColor = Color.White;
//txtOffsetX.Dock = DockStyle.Fill;
txtOffsetX.BorderStyle = BorderStyle.None;
txtOffsetX.BackColor = Color.FromArgb(56, 56, 56);
txtOffsetX.KeyUp += TxtOffsetX_KeyUp;
txtOffsetX.Tag = slotIndex;
TextBox txtOffsetY = new TextBox();
txtOffsetY.TextAlign = HorizontalAlignment.Center;
txtOffsetY.Size = new Size(50, 30);
if (yDic.ContainsKey(slotIndex))
{
txtOffsetY.Text = xDic[slotIndex].ToString("0.000");
}
else
{
txtOffsetY.Text = "0";
}
txtYDic.Add(slotIndex, txtOffsetY);
txtOffsetY.Font = new Font("宋体", 9);
txtOffsetY.ForeColor = Color.White;
//txtOffsetY.Dock = DockStyle.Fill;
txtOffsetY.BorderStyle = BorderStyle.None;
txtOffsetY.BackColor = Color.FromArgb(56, 56, 56);
txtOffsetY.KeyUp += TxtOffsetY_KeyUp;
txtOffsetY.Tag = slotIndex;
tableLayoutPanel.Controls.Add(txtOffsetX, 0, 0);
tableLayoutPanel.Controls.Add(txtOffsetY, 0, 1);
//Label lblColHeader = new Label();
//lblColHeader.MouseDown += LblColHeader_MouseDown;
//lblColHeader.TextAlign = ContentAlignment.MiddleCenter;
//lblColHeader.Text = slotIndex.ToString();
//lblColHeader.Dock = DockStyle.Fill;
//lblColHeader.AutoSize = false;
//lblColHeader.ForeColor = Color.White;
tableLayoutPanel1.Controls.Add(tableLayoutPanel, c, r);
}
}
}
public void DataBind(DataTable data)
{
foreach (DataRow dataRow in data.Rows)
{
int slotIndex = int.Parse(dataRow["slotindex"].ToString());
if(txtXDic.ContainsKey(slotIndex))
{
txtXDic[slotIndex].Text = dataRow["offsetX"].ToString();
txtYDic[slotIndex].Text = dataRow["offsetY"].ToString();
}
}
}
private void TxtOffsetX_KeyUp(object sender, KeyEventArgs e)
{
if(e.KeyCode== Keys.Enter)
{
TextBox txtSlot=(TextBox)sender;
SlotValueChanged?.Invoke(int.Parse(txtSlot.Tag.ToString()),"X",double.Parse(txtSlot.Text));
}
}
private void TxtOffsetY_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
TextBox txtSlot = (TextBox)sender;
SlotValueChanged?.Invoke(int.Parse(txtSlot.Tag.ToString()), "Y", double.Parse(txtSlot.Text));
}
}
private void LblColHeader_MouseDown(object sender, MouseEventArgs e)
{
tableLayoutPanel1_MouseDown(sender, e);
}
private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
this.DoubleBuffered = true;
Graphics g = this.tableLayoutPanel1.CreateGraphics();
g.FillRectangle(new SolidBrush(Color.FromArgb(200, Color.Pink)), selectRect);
}
private bool drawRegion = false;
private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && drawRegion == false)
{
drawRegion = true;
selectRect.X = e.X;
selectRect.Y = e.Y;
}
}
private void tableLayoutPanel1_MouseMove(object sender, MouseEventArgs e)
{
if (drawRegion)
{
selectRect.Width = e.X - selectRect.X;
selectRect.Height = e.Y - selectRect.Y;
tableLayoutPanel1_Paint(null, null);
}
}
private void tableLayoutPanel1_MouseUp(object sender, MouseEventArgs e)
{
drawRegion = false;
}
}
}