一.設計時效果
二.運行時效果
三.簡單談談設計思路
同樣地,類似上篇文章制作DataTimePicker,這裡制作的控件無非是一個復合控件顯示在一個列表框下.主要實現的功能包括雙擊選中行返回,鍵盤回車後返回當前行,將返回行的信息用分隔符號組合起來的字符串顯示在combobox 的text中.感性趣的朋友可以發mail給我.
四.部分源代碼
void FilterTextbox_TextChanged(object sender, EventArgs e)
...{
TextBox txtbox = sender as TextBox;
if (this.DataSource is DataTable)
...{
DataTable tbl = (DataTable)this.DataSource;
string s = tbl.Columns[this._ColumnIndex].ColumnName + " like ''%" + txtbox.Text + "%''";
tbl.DefaultVIEw.RowFilter = s;
}
else if (this.DataSource is DataVIEw)
...{
DataView dgv = (DataVIEw)this.DataSource;
dgv.RowFilter = dgv.Table.Columns[this._ColumnIndex].ColumnName + " like ''%" + txtbox.Text + "%''";
}
}
void jCSShow_CancelButtonClIEntEvent()
...{
this.tsdshow.Hide();
this.canDropDown = true;
}
void jCSShow_OkButtonClickEvent()
...{
GetCurrentValue();
}
public string ReturenValue
...{
get ...{ return this.txtbox.Text; }
set ...{ this.txtbox.Text = value; }
}
/**//// <summary>
/// 分隔符號
/// </summary>
public string SeperateString
...{
get ...{ return this._seperatestring; }
set ...{ this._seperatestring = value; }
}
public int ColumnIndex
...{
get ...{ return this._ColumnIndex; }
set
...{
if (this.DataSource is DataTable)
...{
DataTable tbl = (DataTable)this.DataSource;
if (value > tbl.Columns.Count - 1)
...{
throw new Exception("設置檢索列的索引超出數據源列數!");
}
}
else if (this.DataSource is DataVIEw)
...{
DataView dgv = (DataVIEw)this.DataSource;
if (value > dgv.Table.Columns.Count - 1)
...{
throw new Exception("設置檢索列的索引超出數據源列數!");
}
}
this._ColumnIndex = value;
}
}
private void GetCurrentValue()
...{
System.Windows.Forms.DataGridViewRow datarowvIEw = this.jCSShow.DataGrid.CurrentRow;
string s = "";
for (int i = 0; i < datarowvIEw.Cells.Count; i++)
...{
if (i != datarowvIEw.Cells.Count - 1)
...{
s += datarowvIEw.Cells[i].Value.ToString() + this._seperatestring;
}
else
...{
s += datarowvIEw.Cells[i].Value.ToString();
}
}
if (s.Length != 0)
...{
this.txtbox.Text = s;
this.tsdshow.Hide();
this.txtbox.Focus();
this.canDropDown = true;
}
}
void DataGrid_MouseDown(object sender, MouseEventArgs e)
...{
if (e.Button == MouseButtons.Left && e.Clicks == 2)
...{
System.Windows.Forms.DataGridVIEw.HitTestInfo hittest = this.jCSShow.DataGrid.HitTest(e.X, e.Y);
if (hittest.Type == DataGridVIEwHitTestType.Cell)
...{
GetCurrentValue();
}
}
}
void txtbox_MouseDown(object sender, MouseEventArgs e)
...{
this.canDropDown = true;
}
void gridvIEw_KeyDown(object sender, KeyEventArgs e)
...{
if (e.KeyData == Keys.Enter)
...{
GetCurrentValue();
}
}
public Object DataSource
...{
get ...{ return this.jCSShow.DataSource; }
set
...{
this.jCSShow.DataSource = value;
}
}
protected override void OnResize(EventArgs e)
...{
base.OnResize(e);
if (this.Width > 21)
this.txtbox.Width = this.Width - 21;
dropdownrect = new Rectangle(this.txtbox.Width, 0, 18, 21);
this.Height = 21;
}
protected override void OnPaint(PaintEventArgs e)
...{
base.OnPaint(e);
Graphics g = e.Graphics;
if (this._ismousedown)
...{
ControlPaint.DrawComboButton(g, this.dropdownrect, ButtonState.Pushed);
}
else
...{
ControlPaint.DrawComboButton(g, this.dropdownrect, ButtonState.Normal);
}
}
protected override void OnMouseDown(MouseEventArgs e)
...{
base.OnMouseDown(e);
if (this.dropdownrect.Contains(new Point(e.X, e.Y)))
...{
this._ismousedown = true;
this.Invalidate(this.dropdownrect);
ShowDataGridVIEw();
}
}
protected override void OnMouseUp(MouseEventArgs e)
...{
base.OnMouseUp(e);
if (this._ismousedown)
...{
this._ismousedown = false;
this.Invalidate(this.dropdownrect);
}
}
private void ShowDataGridVIEw()
...{
if (this.canDropDown)
...{
Point location;
location = this.Parent.PointToScreen(this.Location);
location = this.FindForm().PointToClIEnt(location);
location.Y = location.Y + this.Height;
this.tsdshow.Show(this.FindForm(), location);
this.jCSShow.DataGrid.Focus();
}
else if (!this.canDropDown && this.tsdshow.Visible)
...{
tsdshow.Hide();
this.Focus();
}
canDropDown = !canDropDown;
}