Files
VisionEdit/UsingControl/HZHControls/Controls/List/UCHorizontalList.cs
liu.wenjie a24dda2525 1、优化LOG显示与引用
2、添加PMA工具,工具内容待完善
3、修复流程树显示
4、添加开源项目,优化UI空间
5、其他BUG更改
2021-11-23 15:51:37 +08:00

262 lines
8.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ***********************************************************************
// Assembly : HZH_Controls
// Created : 08-08-2019
//
// ***********************************************************************
// <copyright file="UCHorizontalList.cs">
// Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
// </copyright>
//
// Blog: https://www.cnblogs.com/bfyx
// GitHubhttps://github.com/kwwwvagaa/NetWinformControl
// giteehttps://gitee.com/kwwwvagaa/net_winform_custom_control.git
//
// If you use this code, please keep this note.
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace HZH_Controls.Controls
{
/// <summary>
/// Class UCHorizontalList.
/// Implements the <see cref="System.Windows.Forms.UserControl" />
/// </summary>
/// <seealso cref="System.Windows.Forms.UserControl" />
public partial class UCHorizontalList : UserControl
{
/// <summary>
/// Gets or sets the selected item.
/// </summary>
/// <value>The selected item.</value>
public UCHorizontalListItem SelectedItem { get; set; }
/// <summary>
/// Occurs when [selected item event].
/// </summary>
public event EventHandler SelectedItemEvent;
/// <summary>
/// The m start item index
/// </summary>
private int m_startItemIndex = 0;
/// <summary>
/// The is automatic select first
/// </summary>
private bool isAutoSelectFirst = true;
/// <summary>
/// Gets or sets a value indicating whether this instance is automatic select first.
/// </summary>
/// <value><c>true</c> if this instance is automatic select first; otherwise, <c>false</c>.</value>
public bool IsAutoSelectFirst
{
get { return isAutoSelectFirst; }
set { isAutoSelectFirst = value; }
}
/// <summary>
/// The data source
/// </summary>
private List<KeyValuePair<string, string>> dataSource = null;
/// <summary>
/// Gets or sets the data source.
/// </summary>
/// <value>The data source.</value>
public List<KeyValuePair<string, string>> DataSource
{
get { return dataSource; }
set
{
dataSource = value;
ReloadSource();
}
}
private Color selectedColor = Color.FromArgb(255, 77, 59);
[Description("选中颜色"), Category("自定义")]
public Color SelectedColor
{
get { return selectedColor; }
set { selectedColor = value; }
}
/// <summary>
/// Initializes a new instance of the <see cref="UCHorizontalList" /> class.
/// </summary>
public UCHorizontalList()
{
InitializeComponent();
}
/// <summary>
/// Reloads the source.
/// </summary>
public void ReloadSource()
{
try
{
ControlHelper.FreezeControl(this, true);
this.panList.SuspendLayout();
this.panList.Controls.Clear();
this.panList.Width = this.panMain.Width;
if (DataSource != null)
{
foreach (var item in DataSource)
{
UCHorizontalListItem uc = new UCHorizontalListItem();
uc.SelectedColor = selectedColor;
uc.DataSource = item;
uc.SelectedItem += uc_SelectItem;
this.panList.Controls.Add(uc);
}
}
this.panList.ResumeLayout(true);
if (this.panList.Controls.Count > 0)
this.panList.Width = panMain.Width + this.panList.Controls[0].Location.X * -1;
this.panList.Location = new Point(0, 0);
m_startItemIndex = 0;
if (this.panList.Width > panMain.Width)
panRight.Visible = true;
else
panRight.Visible = false;
panLeft.Visible = false;
panList.SendToBack();
panRight.SendToBack();
if (isAutoSelectFirst && DataSource != null && DataSource.Count > 0)
{
SelectItem((UCHorizontalListItem)this.panList.Controls[0]);
}
}
finally
{
ControlHelper.FreezeControl(this, false);
}
}
/// <summary>
/// Handles the SelectItem event of the uc control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
void uc_SelectItem(object sender, EventArgs e)
{
SelectItem(sender as UCHorizontalListItem);
}
/// <summary>
/// Selects the item.
/// </summary>
/// <param name="item">The item.</param>
private void SelectItem(UCHorizontalListItem item)
{
if (SelectedItem != null && !SelectedItem.IsDisposed)
SelectedItem.SetSelect(false);
SelectedItem = item;
SelectedItem.SetSelect(true);
if (SelectedItemEvent != null)
SelectedItemEvent(item, null);
}
/// <summary>
/// Handles the MouseDown event of the panLeft control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="MouseEventArgs" /> instance containing the event data.</param>
private void panLeft_MouseDown(object sender, MouseEventArgs e)
{
if (this.panList.Location.X >= 0)
{
this.panList.Location = new Point(0, 0);
return;
}
for (int i = m_startItemIndex; i >= 0; i--)
{
if (this.panList.Controls[i].Location.X < this.panList.Controls[m_startItemIndex].Location.X - panMain.Width)
{
m_startItemIndex = i + 1;
break; ;
}
if (i == 0)
{
m_startItemIndex = 0;
}
}
ResetListLocation();
panRight.Visible = true;
if (this.panList.Location.X >= 0)
{
panLeft.Visible = false;
}
else
{
panLeft.Visible = true;
}
panList.SendToBack();
panRight.SendToBack();
}
/// <summary>
/// Handles the MouseDown event of the panRight control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="MouseEventArgs" /> instance containing the event data.</param>
private void panRight_MouseDown(object sender, MouseEventArgs e)
{
if (this.panList.Location.X + this.panList.Width <= this.panMain.Width)
return;
if (this.panList.Controls.Count <= 0)
return;
for (int i = m_startItemIndex; i < this.panList.Controls.Count; i++)
{
if (this.panList.Location.X + this.panList.Controls[i].Location.X + this.panList.Controls[i].Width > panMain.Width)
{
m_startItemIndex = i;
break;
}
}
ResetListLocation();
panLeft.Visible = true;
if (panList.Width + panList.Location.X <= panMain.Width)
panRight.Visible = false;
else
panRight.Visible = true;
panList.SendToBack();
panRight.SendToBack();
}
/// <summary>
/// Resets the list location.
/// </summary>
private void ResetListLocation()
{
if (this.panList.Controls.Count > 0)
{
this.panList.Location = new Point(this.panList.Controls[m_startItemIndex].Location.X * -1, 0);
}
}
/// <summary>
/// Sets the select.
/// </summary>
/// <param name="strKey">The string key.</param>
public void SetSelect(string strKey)
{
foreach (UCHorizontalListItem item in this.panList.Controls)
{
if (item.DataSource.Key == strKey)
{
SelectItem(item);
return;
}
}
}
}
}