633 lines
24 KiB
C#
633 lines
24 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace arFrame.Control
|
|
{
|
|
public partial class GridView : System.Windows.Forms.Control
|
|
{
|
|
private int bordersize = 0;
|
|
private int menubordersize = 1;
|
|
private int menugap = 5;
|
|
private System.Windows.Forms.Padding padding = new Padding(3, 3, 3, 3);
|
|
private System.Drawing.Color backcolor = System.Drawing.Color.White;
|
|
private System.Drawing.Color bordercolor = System.Drawing.Color.Black;
|
|
private Boolean textattachtoimage = true;
|
|
private Boolean _showIndexString = true;
|
|
|
|
private System.Drawing.Color _shadowColor = System.Drawing.Color.Transparent;
|
|
private System.Drawing.Color foreColorPin = System.Drawing.Color.WhiteSmoke;
|
|
private System.Drawing.Font fontPin = new Font("Consolas", 8, FontStyle.Bold);
|
|
|
|
private Point _matrixsize = new Point(8, 2);
|
|
public Point MatrixSize { get { return _matrixsize; } set { _matrixsize = value; ResetArray(); RemakeChartRect(); } }
|
|
|
|
public Boolean arVeriticalDraw { get; set; }
|
|
|
|
[Browsable(false)]
|
|
public int ColumnCount { get { return _matrixsize.X; } }
|
|
[Browsable(false)]
|
|
public int RowCount { get { return _matrixsize.Y; } }
|
|
public int ItemCount { get { return ColumnCount * RowCount; } }
|
|
|
|
private GridViewItem[] Items;
|
|
|
|
private UInt16[] _values;
|
|
private string[] _titles;
|
|
private string[] _tags;
|
|
private string[] _names;
|
|
private ColorListItem[] _colorlist;
|
|
public ColorListItem[] ColorList { get { return _colorlist; } set { _colorlist = value; this.Invalidate(); } }
|
|
|
|
public string[] Names { get { return _names; } set { _names = value; Invalidate(); } }
|
|
public string[] Titles { get { return _titles; } set { _titles = value; Invalidate(); } }
|
|
public UInt16[] Values { get { return _values; } set { _values = value; Invalidate(); } }
|
|
public string[] Tags { get { return _tags; } set { _tags = value; } }
|
|
|
|
private bool _showdebuginfo = false;
|
|
public Boolean showDebugInfo { get { return _showdebuginfo; } set { _showdebuginfo = value; Invalidate(); } }
|
|
|
|
public void setNames(string[] value)
|
|
{
|
|
_names = value;
|
|
}
|
|
|
|
public void setTitle(string[] value)
|
|
{
|
|
List<string> titlerows = new List<string>();
|
|
List<string> tagrows = new List<string>();
|
|
|
|
for (int i = 0; i < value.Length; i++)
|
|
{
|
|
var r = (int)(Math.Floor((double)(i / ColumnCount)));
|
|
var c = i % ColumnCount;
|
|
|
|
//세로 그리기 였을때에는 다르게 처리해야함 201215
|
|
if(arVeriticalDraw)
|
|
{
|
|
c = (int)(Math.Floor((double)(i / ColumnCount)));
|
|
r = i % ColumnCount;
|
|
}
|
|
|
|
if (titlerows.Count < r + 1) titlerows.Add(string.Empty);
|
|
if (tagrows.Count < r + 1) tagrows.Add(string.Empty);
|
|
|
|
var prestr = titlerows[r];
|
|
if (c > 0 ) prestr += "|";
|
|
titlerows[r] = prestr + value[i];
|
|
|
|
var prestr_t = tagrows[r];
|
|
if (prestr_t != "") prestr_t += "|";
|
|
tagrows[r] = prestr_t + "";
|
|
|
|
if (i < itemCount) this.Items[i].Enable = true;
|
|
}
|
|
this._titles = titlerows.ToArray();
|
|
this._tags = tagrows.ToArray();
|
|
}
|
|
public void setTags(string[] value)
|
|
{
|
|
List<string> titlerows = new List<string>();
|
|
for (int i = 0; i < value.Length; i++)
|
|
{
|
|
var r = (int)(Math.Floor((double)(i / ColumnCount)));
|
|
var c = i % ColumnCount;
|
|
if (titlerows.Count < r + 1) titlerows.Add(string.Empty);
|
|
var prestr = titlerows[r];
|
|
if (c > 0 ) prestr += "|";
|
|
titlerows[r] = prestr + value[i];
|
|
if (i < itemCount) this.Items[i].Enable = true;
|
|
}
|
|
this._tags = titlerows.ToArray();
|
|
}
|
|
public Boolean setTitle(int row, int col, string value, string itemtag = "")
|
|
{
|
|
if (_titles == null) _titles = new string[0];
|
|
if (_tags == null) _tags = new string[0];
|
|
|
|
if (row >= _titles.Length) Array.Resize(ref _titles, row + 1);
|
|
if (row >= _tags.Length) Array.Resize(ref _tags, row + 1);
|
|
|
|
if (_titles[row] == null) _titles[row] = string.Empty;
|
|
if (_tags[row] == null) _tags[row] = string.Empty;
|
|
|
|
var linebuf = _titles[row].Split('|');
|
|
var linebuf_t = _tags[row].Split('|');
|
|
|
|
if (col >= linebuf.Length) Array.Resize(ref linebuf, col + 1);
|
|
if (col >= linebuf_t.Length) Array.Resize(ref linebuf_t, col + 1);
|
|
|
|
linebuf[col] = value;
|
|
linebuf_t[col] = itemtag;
|
|
|
|
_titles[row] = string.Join("|", linebuf);
|
|
_tags[row] = string.Join("|", linebuf_t);
|
|
return true;
|
|
//var idx = row * this.ColumnCount + col;
|
|
//return setTitle(idx, value);
|
|
}
|
|
public Boolean setTitle(int idx, string value)
|
|
{
|
|
if (idx < ColumnCount) return setTitle(0, idx, value);
|
|
else
|
|
{
|
|
//줄값이 필요하다
|
|
var row = (int)(Math.Floor((double)(idx / ColumnCount)));
|
|
var col = idx % ColumnCount;
|
|
return setTitle(row, col, value);
|
|
}
|
|
}
|
|
|
|
|
|
public void setValue(bool[] value)
|
|
{
|
|
var v = new UInt16[value.Length];
|
|
for (int i = 0; i < value.Length; i++)
|
|
v[i] = (UInt16)(value[i] ? 1 : 0);
|
|
_values = v;
|
|
|
|
//값이 잇으니 enable 한다
|
|
for (int i = 0; i < value.Length; i++)
|
|
{
|
|
if (i < Items.Length)
|
|
this.Items[i].Enable = true;
|
|
}
|
|
|
|
}
|
|
public void setValue(UInt16[] value)
|
|
{
|
|
_values = value;
|
|
|
|
for (int i = 0; i < value.Length; i++)
|
|
{
|
|
if (i < Items.Length)
|
|
this.Items[i].Enable = true;
|
|
}
|
|
|
|
}
|
|
public Boolean setValue(int idx, ushort value)
|
|
{
|
|
if (idx >= _values.Length || idx >= this.Items.Length) return false;
|
|
this._values[idx] = value;
|
|
this.Items[idx].Enable = true;
|
|
return true;
|
|
}
|
|
public void ClearValue(ushort defaultValue = 0)
|
|
{
|
|
if (_values != null)
|
|
for (int i = 0; i < _values.Length; i++)
|
|
_values[i] = defaultValue;
|
|
}
|
|
public void ClearTitle(string defaultValue = "")
|
|
{
|
|
if (_values != null)
|
|
for (int i = 0; i < _titles.Length; i++)
|
|
_titles[i] = defaultValue;
|
|
}
|
|
|
|
public void setValue(ushort value)
|
|
{
|
|
for (int i = 0; i < _values.Length; i++)
|
|
this._values[i] = value;
|
|
}
|
|
public void setItemEnable(int idx, bool value)
|
|
{
|
|
if (idx >= _values.Length || idx >= this.Items.Length) return;
|
|
this.Items[idx].Enable = value;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 지정된 컬러태그값을 입력한다.
|
|
/// </summary>
|
|
/// <param name="idx"></param>
|
|
/// <param name="tagString"></param>
|
|
/// <returns></returns>
|
|
public Boolean setValue(int idx, string tagString)
|
|
{
|
|
//동일태그값을 찾는다
|
|
if (idx >= _values.Length) return false;
|
|
|
|
int value = -1;
|
|
for (int i = 0; i < ColorList.Length; i++)
|
|
if (ColorList[i].Remark.ToLower() == tagString.ToLower())
|
|
{
|
|
value = i;
|
|
break;
|
|
}
|
|
|
|
if (value != -1)
|
|
{
|
|
this._values[idx] = (ushort)value;
|
|
this.Items[idx].Enable = true;
|
|
return true;
|
|
}
|
|
else return false;
|
|
|
|
|
|
}
|
|
public Boolean setValue(int idx, bool value)
|
|
{
|
|
return setValue(idx, (ushort)(value ? 1 : 0));
|
|
}
|
|
public Boolean setValue(int row, int col, ushort value)
|
|
{
|
|
var idx = row * this.ColumnCount + col;
|
|
return setValue(idx, value);
|
|
}
|
|
public Boolean setValueToggle(int row, int col, ushort value1, ushort value2)
|
|
{
|
|
var idx = row * this.ColumnCount + col;
|
|
if (getValue(idx) == value1) return setValue(idx, value2);
|
|
else return setValue(idx, value1);
|
|
}
|
|
public Boolean setValue(int row, int col, bool value)
|
|
{
|
|
var idx = row * this.ColumnCount + col;
|
|
return setValue(idx, (ushort)(value ? 1 : 0));
|
|
}
|
|
public Boolean setValue(int row, int col, string value)
|
|
{
|
|
var idx = row * this.ColumnCount + col;
|
|
return setValue(idx, value);
|
|
}
|
|
|
|
public ushort getValue(int idx)
|
|
{
|
|
if (idx >= _values.Length) return 0;
|
|
return _values[idx];
|
|
}
|
|
public ushort getValue(int row, int col)
|
|
{
|
|
var idx = row * this.ColumnCount + col;
|
|
return getValue(idx);
|
|
}
|
|
|
|
[Category("arFrame")]
|
|
public bool ShowIndexString { get { return _showIndexString; } set { _showIndexString = value; Invalidate(); } }
|
|
|
|
[Category("arFrame"), DisplayName("테두리 굵기")]
|
|
public int BorderSize { get { return bordersize; } set { this.bordersize = value; Invalidate(); } }
|
|
[Category("arFrame"), DisplayName("메뉴 테두리 굵기")]
|
|
public int MenuBorderSize { get { return menubordersize; } set { this.menubordersize = value; Invalidate(); } }
|
|
[Category("arFrame"), DisplayName("메뉴 간격")]
|
|
public int MenuGap { get { return menugap; } set { this.menugap = value; RemakeChartRect(); Invalidate(); } }
|
|
[Category("arFrame"), DisplayName("글자를 이미지 다음에 표시"), Description("이미지가 있는 경우 해당 이미지 옆에 글자를 붙입니다")]
|
|
public Boolean TextAttachToImage { get { return textattachtoimage; } set { this.textattachtoimage = value; Invalidate(); } }
|
|
|
|
[Category("arFrame"), DisplayName("색상-테두리")]
|
|
public System.Drawing.Color BorderColor { get { return bordercolor; } set { this.bordercolor = value; Invalidate(); } }
|
|
[Category("arFrame"), DisplayName("내부 여백")]
|
|
public new System.Windows.Forms.Padding Padding { get { return padding; } set { this.padding = value; RemakeChartRect(); Invalidate(); } }
|
|
|
|
[Category("arFrame"), DisplayName("색상-전체배경색")]
|
|
public override System.Drawing.Color BackColor { get { return backcolor; } set { this.backcolor = value; Invalidate(); } }
|
|
|
|
[Category("arFrame"), DisplayName("색상-글자(그림자)")]
|
|
public System.Drawing.Color ShadowColor { get { return _shadowColor; } set { _shadowColor = value; this.Invalidate(); } }
|
|
|
|
[Category("arFrame"), DisplayName("색상-글자")]
|
|
public override Color ForeColor { get { return base.ForeColor; } set { base.ForeColor = value; } }
|
|
|
|
[Category("arFrame"), DisplayName("색상-글자(번호)")]
|
|
public Color ForeColorPin { get { return foreColorPin; } set { foreColorPin = value; } }
|
|
|
|
[Category("arFrame"), DisplayName("글꼴-번호")]
|
|
public Font FontPin { get { return fontPin; } set { fontPin = value; Invalidate(); } }
|
|
[Category("arFrame"), DisplayName("글꼴-항목")]
|
|
public override Font Font { get { return base.Font; } set { base.Font = value; Invalidate(); } }
|
|
|
|
private int mouseOverItemIndex = -1;
|
|
public GridView()
|
|
{
|
|
InitializeComponent();
|
|
|
|
// Set Optimized Double Buffer to reduce flickering
|
|
this.SetStyle(ControlStyles.UserPaint, true);
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
|
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
|
|
|
|
// Redraw when resized
|
|
this.SetStyle(ControlStyles.ResizeRedraw, true);
|
|
|
|
//값과 이름은 외부의 값을 사용한다
|
|
ResetArray();
|
|
|
|
if (MinimumSize.Width == 0 || MinimumSize.Height == 0)
|
|
MinimumSize = new Size(100, 50);
|
|
}
|
|
|
|
|
|
void ResetArray()
|
|
{
|
|
if (this._values != null) Array.Resize(ref this._values, itemCount);// = new UInt16[itemCount];
|
|
// if (this._titles != null) Array.Resize(ref this._titles, itemCount);//
|
|
// if (this._names != null) Array.Resize(ref this._names, itemCount);//
|
|
}
|
|
|
|
int itemCount { get { return ColumnCount * RowCount; } }
|
|
protected override void OnSizeChanged(EventArgs e)
|
|
{
|
|
base.OnSizeChanged(e);
|
|
RemakeChartRect();
|
|
}
|
|
|
|
public event EventHandler<ItemClickEventArgs> ItemClick;
|
|
public class ItemClickEventArgs : EventArgs
|
|
{
|
|
public int idx { get; set; }
|
|
public GridViewItem Item { get; set; }
|
|
public ItemClickEventArgs(int idx_, GridViewItem item)
|
|
{
|
|
this.Item = item;
|
|
this.idx = idx_;
|
|
}
|
|
}
|
|
|
|
protected override void OnMouseClick(MouseEventArgs e)
|
|
{
|
|
//마우스클릭시 해당 버튼을 찾아서 반환한다.
|
|
if (Items == null || Items.Length < 1) return;
|
|
for (int i = 0; i < Items.Length; i++)
|
|
{
|
|
var rect = Items[i].rect;//[i];
|
|
if (rect.Contains(e.Location))
|
|
{
|
|
var menu = Items[i];
|
|
|
|
//미사용개체는 이벤트를 아에 발생하지 않는다
|
|
if (menu.Enable == true && ItemClick != null)
|
|
ItemClick(this, new ItemClickEventArgs(i, menu));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnMouseLeave(EventArgs e)
|
|
{
|
|
this.mouseOverItemIndex = -1;
|
|
this.Invalidate();
|
|
}
|
|
protected override void OnMouseMove(MouseEventArgs e)
|
|
{
|
|
if (Items == null || Items.Length < 1)
|
|
{
|
|
this.mouseOverItemIndex = -1;
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < Items.Length; i++)
|
|
{
|
|
var rect = Items[i].rect;// rects[i];
|
|
if (rect.Contains(e.Location))
|
|
{
|
|
if (i != mouseOverItemIndex)
|
|
{
|
|
mouseOverItemIndex = i;
|
|
this.Invalidate();
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
public void setItemTextAlign(int row, int col, System.Drawing.ContentAlignment TextAlign)
|
|
{
|
|
var item = this.Items.Where(t => t.row == row && t.col == col).FirstOrDefault();
|
|
if (item != null) item.TextAlign = TextAlign;
|
|
}
|
|
public void setItemTextAlign(System.Drawing.ContentAlignment TextAlign)
|
|
{
|
|
foreach (var item in this.Items)
|
|
item.TextAlign = TextAlign;
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs pe)
|
|
{
|
|
//배경그리기
|
|
//using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(DisplayRectangle, BackColor, BackColor2On, System.Drawing.Drawing2D.LinearGradientMode.Vertical))
|
|
pe.Graphics.FillRectangle(new SolidBrush(BackColor), DisplayRectangle);
|
|
|
|
if (Items == null)
|
|
{
|
|
pe.Graphics.DrawString("no items", this.Font, Brushes.Red, 100, 100);
|
|
return;
|
|
}
|
|
|
|
var items = Items.OrderBy(t => t.No);
|
|
foreach (var menu in items)
|
|
{
|
|
drawItem(menu.idx, pe.Graphics);
|
|
}
|
|
|
|
//테두리 그리기
|
|
if (BorderSize > 0)
|
|
{
|
|
pe.Graphics.DrawRectangle(new Pen(this.BorderColor, BorderSize),
|
|
this.DisplayRectangle.Left,
|
|
this.DisplayRectangle.Top,
|
|
this.DisplayRectangle.Width - 1,
|
|
this.DisplayRectangle.Height - 1);
|
|
}
|
|
}
|
|
|
|
public void drawItem(int itemIndex, Graphics g = null)
|
|
{
|
|
if (g == null) g = this.CreateGraphics();
|
|
var menu = this.Items[itemIndex];
|
|
|
|
if (menu.rect == RectangleF.Empty) return;
|
|
|
|
var rect = menu.rect;// rects[i];
|
|
|
|
var diplayText = string.Empty;
|
|
|
|
// if(_titles[1].Trim() != "")
|
|
// Console.WriteLine("sdf");
|
|
//타이틀이 줄번호별로 처리됨
|
|
if (_titles != null && menu.row < _titles.Length)
|
|
{
|
|
if (_titles[menu.row] == null) _titles[menu.row] = string.Empty;
|
|
var linebif = _titles[menu.row].Split('|');
|
|
if (menu.col < linebif.Length)
|
|
diplayText = linebif[menu.col];
|
|
}
|
|
|
|
UInt16 Value = 0;
|
|
if (_values != null && menu.idx < _values.Length) Value = _values[menu.idx];
|
|
|
|
//배경이 투명이 아니라면 그린다.
|
|
var bgColor1 = Color.FromArgb(30, 30, 30);// BackColor1Off;
|
|
var bgColor2 = Color.FromArgb(30, 30, 30);// BackColor2Off;
|
|
|
|
//해당 값에 따른 컬러값을 읽는다.
|
|
if (ColorList != null && Value < ColorList.Length)
|
|
{
|
|
bgColor1 = this.ColorList[Value].BackColor1;
|
|
bgColor2 = this.ColorList[Value].BackColor2;
|
|
}
|
|
|
|
using (var sb = new System.Drawing.Drawing2D.LinearGradientBrush(rect, bgColor1, bgColor2, System.Drawing.Drawing2D.LinearGradientMode.Vertical))
|
|
g.FillRectangle(sb, rect);
|
|
|
|
// if (mouseOverItemIndex == menu.idx)
|
|
// this.Cursor = Cursors.Hand;
|
|
// else
|
|
// this.Cursor = Cursors.Arrow;
|
|
|
|
//테두리를 그리는 속성과 트기가 설정된 경우에만 표시
|
|
//if (mouseOverItemIndex == i)
|
|
// {
|
|
// pe.Graphics.DrawRectangle(new Pen(Color.DeepSkyBlue), rect.Left, rect.Top, rect.Width, rect.Height);
|
|
//}
|
|
//else
|
|
{
|
|
if (MenuBorderSize > 0)
|
|
{
|
|
using (var p = new Pen(BorderColor, MenuBorderSize))
|
|
g.DrawRectangle(p, rect.Left, rect.Top, rect.Width, rect.Height);
|
|
}
|
|
}
|
|
|
|
//인덱스번호 출력
|
|
if (ShowIndexString && _names != null && menu.idx < _names.Length)
|
|
{
|
|
//표시글자
|
|
var idxstr = string.Format("[{0}] {1}", menu.idx, _names[menu.idx]);
|
|
|
|
//그림자 추가
|
|
if (ShadowColor != System.Drawing.Color.Transparent)
|
|
g.DrawString(idxstr, FontPin, new SolidBrush(ShadowColor), menu.rect.Left + 4, menu.rect.Top + 4);
|
|
|
|
//일반글자표시
|
|
g.DrawString(idxstr, FontPin, new SolidBrush(this.ForeColorPin), menu.rect.Left + 3, menu.rect.Top + 3);
|
|
}
|
|
|
|
if (diplayText != "")
|
|
{
|
|
using (StringFormat sf = new StringFormat(StringFormatFlags.NoClip))
|
|
{
|
|
//글자를 텍스트 이후에 붙이는 거라면?
|
|
if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.BottomLeft ||
|
|
menu.TextAlign == ContentAlignment.BottomRight) sf.LineAlignment = StringAlignment.Far;
|
|
else if (menu.TextAlign == ContentAlignment.MiddleCenter || menu.TextAlign == ContentAlignment.MiddleLeft ||
|
|
menu.TextAlign == ContentAlignment.MiddleRight) sf.LineAlignment = StringAlignment.Center;
|
|
else if (menu.TextAlign == ContentAlignment.TopCenter || menu.TextAlign == ContentAlignment.TopLeft ||
|
|
menu.TextAlign == ContentAlignment.TopRight) sf.LineAlignment = StringAlignment.Near;
|
|
|
|
if (menu.TextAlign == ContentAlignment.BottomCenter || menu.TextAlign == ContentAlignment.MiddleCenter ||
|
|
menu.TextAlign == ContentAlignment.TopCenter) sf.Alignment = StringAlignment.Center;
|
|
else if (menu.TextAlign == ContentAlignment.BottomLeft || menu.TextAlign == ContentAlignment.MiddleLeft ||
|
|
menu.TextAlign == ContentAlignment.TopLeft) sf.Alignment = StringAlignment.Near;
|
|
else if (menu.TextAlign == ContentAlignment.BottomRight || menu.TextAlign == ContentAlignment.MiddleRight ||
|
|
menu.TextAlign == ContentAlignment.TopRight) sf.Alignment = StringAlignment.Far;
|
|
|
|
//그림자 추가
|
|
if (ShadowColor != System.Drawing.Color.Transparent)
|
|
g.DrawString(diplayText, this.Font, new SolidBrush(ShadowColor),
|
|
new RectangleF((float)(rect.Left + 1f), (float)(rect.Top + 1f), (float)rect.Width, (float)rect.Height), sf);
|
|
|
|
g.DrawString($"{diplayText}", this.Font, new SolidBrush(ForeColor), rect, sf);
|
|
}
|
|
}
|
|
|
|
if (showDebugInfo)
|
|
{
|
|
g.DrawString(Value.ToString(), this.fontPin, Brushes.SkyBlue, rect.Left, rect.Top);
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// arFrame 전용 속성값을 복사 합니다
|
|
/// </summary>
|
|
/// <param name="ctl"></param>
|
|
public void copyTo(GridView ctl)
|
|
{
|
|
ctl.backcolor = this.backcolor;
|
|
ctl.menugap = this.menugap;
|
|
ctl.Items = this.Items;
|
|
ctl.menubordersize = this.menubordersize;
|
|
ctl.padding = this.padding;
|
|
ctl.ForeColor = this.ForeColor;
|
|
ctl.Font = this.Font;
|
|
ctl.TextAttachToImage = this.TextAttachToImage;
|
|
ctl.bordercolor = this.bordercolor;
|
|
ctl.bordersize = this.bordersize;
|
|
}
|
|
|
|
public void RemakeChartRect()
|
|
{
|
|
if (DisplayRectangle == Rectangle.Empty) return;
|
|
|
|
double x = 0;
|
|
double y = 0;
|
|
double w = DisplayRectangle.Width / (ColumnCount * 1.0);
|
|
double h = DisplayRectangle.Height / (RowCount * 1.0);
|
|
|
|
|
|
//아이템갯수가 달라졌으므로 다시 갱신해야함
|
|
GridViewItem[] item = new GridViewItem[RowCount * ColumnCount];
|
|
|
|
if(arVeriticalDraw)
|
|
{
|
|
for (int c = 0; c < ColumnCount; c++)
|
|
{
|
|
for (int r = 0; r < RowCount; r++)
|
|
{
|
|
int idx = c * ColumnCount + r;
|
|
item[idx] = new GridViewItem(idx, r, c);
|
|
|
|
if (this.Items != null && idx < this.Items.Length)
|
|
item[idx].Enable = this.Items[idx].Enable; // false;
|
|
else
|
|
item[idx].Enable = false;
|
|
|
|
item[idx].Padding = new Padding(0, 0, 0, 0);
|
|
item[idx].TextAlign = ContentAlignment.MiddleCenter;
|
|
x = (c * w);
|
|
y = (r * h);
|
|
item[idx].Dirty = true;
|
|
item[idx].rect = new RectangleF((float)x, (float)y, (float)w, (float)h);
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
for (int r = 0; r < RowCount; r++)
|
|
{
|
|
for (int c = 0; c < ColumnCount; c++)
|
|
{
|
|
int idx = r * ColumnCount + c;
|
|
item[idx] = new GridViewItem(idx, r, c);
|
|
|
|
if (this.Items != null && idx < this.Items.Length)
|
|
item[idx].Enable = this.Items[idx].Enable; // false;
|
|
else
|
|
item[idx].Enable = false;
|
|
|
|
item[idx].Padding = new Padding(0, 0, 0, 0);
|
|
item[idx].TextAlign = ContentAlignment.MiddleCenter;
|
|
x = (c * w);
|
|
y = (r * h);
|
|
item[idx].Dirty = true;
|
|
item[idx].rect = new RectangleF((float)x, (float)y, (float)w, (float)h);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
this.Items = item;
|
|
|
|
|
|
this.Invalidate();
|
|
|
|
}
|
|
}
|
|
}
|