我想做个类似listBox的空间,
不过比它复杂点,
就是在每个item前加个checkbox,后面加个textbox,
,
不是将3个控件拖到一个usercontrol啊 !!申明:是改造 啊 我记得datagridview就有这个功能。请大家帮忙找下,原创的分就更多了
不过比它复杂点,
就是在每个item前加个checkbox,后面加个textbox,
,
不是将3个控件拖到一个usercontrol啊 !!申明:是改造 啊 我记得datagridview就有这个功能。请大家帮忙找下,原创的分就更多了
其实我觉得拖到UserControl的方法更好
那有哪些要注意的吗?
比如怎么画checkbox和textbox呢?
楼主,要制造的最终控件的外部形象和控件功能,没有描述清楚。自己画checkbox和textbox?有现成不用,制作一个,不可取。
2行 [checkbox] [string] [textbox]
3行 [checkbox] [string] [textbox]
4行 [checkbox] [string] [textbox]
5行 [checkbox] [string] [textbox]
.
.
..
//继承CheckListBox
//各数组控件索引号对应行号TextBox[] tbs=new TexBox[n];
Label[] lbs=new Label[n]
for(int =0;i<n;i++)
{
// 定位(行距,列距 ---> Location)、赋值、...
// 添加到容器 Controls.Add(...);
}
我也刚写了一个事后边加一个button
设置button parent 和location显示
{
public class ListBoxEx : ListBox
{
public ListBoxEx()
{
this.DrawMode = DrawMode.OwnerDrawFixed;
btnList = new List<Button>();
}
public override DrawMode DrawMode
{
get
{
return DrawMode.OwnerDrawFixed;
}
set
{
base.DrawMode = DrawMode.OwnerDrawFixed;
}
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
this.Refresh();
}
public Button FindItemButton(int index)
{
// return this.Controls.Find(this.Name + "$ItemComboBox" + index.ToString(), true)[0];
if (index >= btnList.Count)
return null;
return btnList[index];
} /// <summary>
/// 提供删除item项
/// </summary>
/// <param name="index"></param>
public void RemoveItem(int index)
{
this.Items.RemoveAt(index);
btnList.RemoveAt(index);
this.Refresh();
}
/// <summary>
/// 提供移动item项
/// </summary>
/// <param name="offset"></param>
public void MoveItem(int offset)
{
int index = this.SelectedIndex + offset;
if (index > -1 && index < this.Items.Count)
{
int oldSelectedIndex = this.SelectedIndex;
MDIChildListBoxItem item = (MDIChildListBoxItem)this.SelectedItem;
this.Items.RemoveAt(oldSelectedIndex);
this.Items.Insert(index, item);
Button btn = btnList[oldSelectedIndex];
btnList.RemoveAt(oldSelectedIndex);
btnList.Insert(index, btn); this.Refresh();
}
else
{
MessageBox.Show("不是可用的移动矢量"); } }
private ToggleItem GetNexttoggleItem(ToggleItem tog)
{//图片替换
int index = -1;
for (int i = 0; i < ToggleItemList.Count; i++)
{
ToggleItem item =(ToggleItem)ToggleItemList[i];
if (item.Tag == tog.Tag)
{
index = i;
break;
}
}
return ((ToggleItem)ToggleItemList[(index + 1) % ToggleItemList.Count]);
}
private List<ToggleItem> toggleItemList
[Bindable(false), Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<ToggleItem> ToggleItemList
{
get
{
if (toggleItemList == null)
toggleItemList = new List<ToggleItem>();
return toggleItemList;
} set
{
if (toggleItemList == null)
toggleItemList = new List<ToggleItem>();
toggleItemList = value;
}
} //主要重写事件
protected override void OnDrawItem(DrawItemEventArgs e)
{
this.DrawMode = DrawMode.OwnerDrawFixed;
this.ItemHeight = 22;
e.DrawBackground();
e.DrawFocusRectangle();
Brush myBrush = Brushes.Black;
if (e.Index > -1 && e.Index < this.Items.Count)
{
string drawString = (e.Index + 1)+ " " + this.Items[e.Index].ToString();
e.Graphics.DrawString(drawString, e.Font, new SolidBrush(e.ForeColor), e.Bounds, StringFormat.GenericDefault);
AddButtonToItem(e);
}
base.OnDrawItem(e); } private List<Button> btnList = null;
protected void AddButtonToItem(DrawItemEventArgs e)
{
if (btnList.Count <= e.Index)
{
btnList.Add(new Button());
Button btn = btnList[e.Index];
btn.BackColor = System.Drawing.Color.LightSkyBlue ;
btn.Name = this.Name + "$ItemButton" + e.Index.ToString();
btn.Width = 20;
btn.Height = 20;
btn.ImageAlign = ContentAlignment.MiddleCenter;
btn.TextImageRelation = TextImageRelation.ImageAboveText;
if (toggleItemList.Count > 0)
{
btn.BackgroundImage = ((ToggleItem)toggleItemList[0]).BGImage;
//btn.Width = toggleItemList[0].BGImage.Width;
//btn.Height = toggleItemList[0].BGImage.Height;
btn.Tag = ((ToggleItem)toggleItemList[0]).Tag;
}
btn.Parent = this;
btn.Click += new EventHandler(ItemButtonClickHandler);
}
Button bt = btnList[e.Index];
bt.Left = this.Width - bt.Width - 20;
bt.Top = e.Bounds.Top;
}
/// <summary>
/// item button双击事件;
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ItemButtonClickHandler(object sender, EventArgs e)
{
int index = -1;
if (sender is Button)
index = this.IndexFromPoint(((Button)sender).Location); if (index == -1)
return; Button btn = sender as Button;
ToggleItem togold = new ToggleItem((string)btn.Tag, btn.BackgroundImage);
ToggleItem tognew = this.GetNexttoggleItem(togold);
//btn.Width = tognew.BGImage.Width;
//btn.Height = tognew.BGImage.Height;
btn.BackgroundImage = tognew.BGImage;
btn.Tag = tognew.Tag; ItemEventHandler handler = (ItemEventHandler)Events[ItemLabelClickObj];
if (handler != null)
{
handler(sender, new ItemButtonClickEventArgs(index)); ;
}
} #region
private static readonly object ItemLabelClickObj = new object();
public delegate void ItemEventHandler(object sender, ItemButtonClickEventArgs e);
public class ItemButtonClickEventArgs : EventArgs
{
private int index;
public ItemButtonClickEventArgs(int index)
: base()
{
this.index = index;
}
public int Index
{
get
{
return index;
}
}
} public event ItemEventHandler ItemLabelClick
{
add
{
Events.AddHandler(ItemLabelClickObj, value);
}
remove
{
Events.RemoveHandler(ItemLabelClickObj, value);
}
}
#endregion
}
[Serializable]
public class ToggleItem
{
private string tag;
private Image bgImage;
public ToggleItem()
{
}
public ToggleItem(string tag, Image bg)
{
this.tag = tag;
this.bgImage = bg;
}
public string Tag
{
get
{
return tag;
}
set
{
tag = value;
}
} public Image BGImage
{
get
{
return bgImage;
} set
{
bgImage = value; }
} }}