屠宰场客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
5.4 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BWP.WinFormControl
{
public class UComboBox : ComboBox
{
ToolTip itemTip = null;
public UComboBox()
{
this.DropDown += (sender, de) =>
{
CRefreshItems();
//if (string.IsNullOrEmpty(this.Text))
// return;
//if (_enableTopItem && Items.Count > 1)
// this.SelectedIndex = 1;
//else if (!_enableTopItem && Items.Count > 0)
// this.SelectedIndex = 0;
SelectionStart = Text.Length;
};
this.SelectedIndexChanged += (sender, e) =>
{
var item = SelectedItem as WordPair;
if (item.DisplayName == string.Empty)
_selectedObj = null;
else
_selectedObj = item;
};
this.DrawMode = DrawMode.OwnerDrawFixed;
this.DrawItem += new DrawItemEventHandler(cb_DrawItem);
this.DropDownClosed += new EventHandler(cb_DropDownClosed);
itemTip = new ToolTip();
itemTip.SetToolTip(this, "");
}
void cb_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
// 绘制背景
e.DrawBackground();
//绘制列表项目
e.Graphics.DrawString(this.Items[e.Index].ToString(), e.Font, System.Drawing.Brushes.Black, e.Bounds);
//将高亮的列表项目的文字传递到toolTip1(之前建立ToolTip的一个实例)
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
itemTip.Show(this.Items[e.Index].ToString(), this, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + e.Bounds.Height);
e.DrawFocusRectangle();
}
void cb_DropDownClosed(object sender, EventArgs e)
{
itemTip.Hide(this);
}
public string DefaultServerPath = "/MainSystem/B3ClientService/Rpcs/";
public string CodeArgs { get; set; }
private bool _enableTopItem = true;
public bool EnableTopItem
{
get { return _enableTopItem; }
set { _enableTopItem = value; }
}
private int range = 10;
public int Range
{
get { return range; }
set { range = value; }
}
private string rpcPath;
public void Init(string _rpcPath)
{
rpcPath = _rpcPath;
if (string.IsNullOrEmpty(rpcPath))
return;
rpcPath = string.Format("{0}{1}", DefaultServerPath, rpcPath);
}
protected override void OnKeyUp(KeyEventArgs e)
{
base.OnKeyUp(e);
if (e.KeyCode == System.Windows.Forms.Keys.Enter)
{
this.FindForm().Cursor = Cursors.Default;
if (string.IsNullOrEmpty(this.Text) || this.DisplayValue != this.Text || string.IsNullOrEmpty(this.SelectedText))
{
if (!this.DroppedDown)
this.DroppedDown = true;
}
}
}
void CRefreshItems()
{
var inputArgs = string.Empty;
if (this.SelectedItem == null)
inputArgs = this.Text;
var list = ComboBoxHelper.GetList(rpcPath, inputArgs, CodeArgs, Range);
if (_enableTopItem)
list.Insert(0, new WordPair(string.Empty));
this.Items.Clear();
foreach (var item in list)
this.Items.Add(item);
this.DisplayMember = "DisplayName";
this.ValueMember = "PhyName";
}
public void Clear()
{
_selectedObj = null;
this.Text = string.Empty;
}
public void Fill(string display, string value)
{
if (string.IsNullOrEmpty(display))
{
Clear();
return;
}
_selectedObj = new WordPair(display, value);
this.Text = display == null ? string.Empty : display;
}
public bool IsEmpty { get { return _selectedObj == null; } }
public string DisplayValue { get { if (IsEmpty) return null; return _selectedObj.DisplayName; } }
public string Value { get { if (IsEmpty) return null; return _selectedObj.PhyName; } }
public long? LongValue
{
get
{
if (IsEmpty)
return null;
long v;
if (long.TryParse(_selectedObj.PhyName, out v))
return v;
return null;
}
}
private WordPair _selectedObj = null;
protected override void OnDropDown(EventArgs e)
{
base.OnDropDown(e);
AdjustComboBoxDropDownListWidth(); //调整comboBox的下拉列表的大小
}
private void AdjustComboBoxDropDownListWidth()
{
Graphics g = null;
Font font = null;
try
{
int width = this.Width;
g = this.CreateGraphics();
font = this.Font;
//checks if a scrollbar will be displayed.
//If yes, then get its width to adjust the size of the drop down list.
int vertScrollBarWidth =
(this.Items.Count > this.MaxDropDownItems)
? SystemInformation.VerticalScrollBarWidth : 0;
int newWidth;
foreach (object s in this.Items) //Loop through list items and check size of each items.
{
if (s != null)
{
newWidth = (int)g.MeasureString(s.ToString().Trim(), font).Width
+ vertScrollBarWidth;
if (width < newWidth)
width = newWidth; //set the width of the drop down list to the width of the largest item.
}
}
this.DropDownWidth = width;
}
catch
{ }
finally
{
if (g != null)
g.Dispose();
}
}
}
}