DataGradView自定义单选
// 窗体初始化
private static ComboBox _comboBox = null;
_comboBox = new ComboBox();
_comboBox.DrawItem += _comboBox_DrawItem;
_comboBox.SelectedIndexChanged += _comboBox_SelectedIndexChanged;
_comboBox.Visible = false;
dataGridView.Controls.Add(_comboBox);
dataGridView.Paint += DataGridView_Paint;
private void _comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (dataGridView.CurrentCell != null)
dataGridView.CurrentCell.Value = _comboBox.Items[_comboBox.SelectedIndex];
}
private void _comboBox_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.Graphics.DrawString(_comboBox.Items[e.Index].ToString(), e.Font, Brushes.Black,
e.Bounds, StringFormat.GenericDefault);
}
private void DataGridView_Paint(object sender, PaintEventArgs e)
{
// 当点击一次后 在点击按钮 会出现提示窗体被遮盖的情况
_comboBox.Visible = false;
//_checkedCombo.Visible = false;
if (dataGridView.RowCount == 0 || dataGridView.CurrentCell == null)
{
return;
}
DataGridViewColumn column = dataGridView.CurrentCell.OwningColumn;
if (column == null)
return;
int columnIndex = dataGridView.CurrentCell.ColumnIndex;
int rowIndex = dataGridView.CurrentCell.RowIndex;
Rectangle rect = dataGridView.GetCellDisplayRectangle(columnIndex, rowIndex, false);
//Debug.WriteLine("DataGridView_Paint, Rectangle:{0}, columnIndex:{1}, rowIndex:{2}", rect, columnIndex, rowIndex);
if (column.Name.Equals(colZiDuan1.Name))
{
_comboBox.Left = rect.Left;
_comboBox.Top = rect.Top;
_comboBox.Width = rect.Width;
_comboBox.Height = rect.Height;
//_comboBox.Visible = true;
}
}
private void dataGridView_CurrentCellChanged(object sender, EventArgs e)
{
if (dataGridView == null || dataGridView.CurrentCell == null)
return;
DataGridViewColumn column = dataGridView.CurrentCell.OwningColumn;
if (column == null)
return;
int columnIndex = dataGridView.CurrentCell.ColumnIndex;
int rowIndex = dataGridView.CurrentCell.RowIndex;
Rectangle rect = dataGridView.GetCellDisplayRectangle(columnIndex, rowIndex, false);
Debug.WriteLine("CurrentCellChanged, Rectangle:{0}, columnIndex:{1}, rowIndex:{2}", rect, columnIndex, rowIndex);
//_checkedCombo.DataSource = new List<string> { "" };
//如果是要显示下拉列表的列的话
_comboBox.Visible = false;
if (column.Name.Equals(colZiDuanName.Name))
{
// 清空 否则会带着之前的记录过来 写在里边
_comboBox.DataSource = new List<string>{""};
_comboBox.Left = rect.Left;
_comboBox.Top = rect.Top;
_comboBox.Width = rect.Width;
_comboBox.Height = rect.Height;
string qinShiXing = dataGridView.Rows[rowIndex].Cells[colZiDuanName.Name].Value.ToString();
_comboBox.DataSource = qinShiXingStr;
if (qinShiXingStr.Contains(qinShiXing))
{
int index = _comboBox.Items.IndexOf(qinShiXing);
_comboBox.SelectedIndex = index;
}
_comboBox.Visible = true;
}
}
private void dataGridView_Scroll(object sender, ScrollEventArgs e)
{
_comboBox.Visible = false;
_checkedCombo.Visible = false;
}
DataGradView自定义多选
_checkedCombo = new CheckedComboBox();
_checkedCombo.ValueSeparator = ";";
_checkedCombo.DrawItem += _checkedCombo_DrawItem; ;
_comboBox.SelectedIndexChanged += _comboBox_SelectedIndexChanged;
_checkedCombo.TextChanged += _checkedCombo_TextChanged;
_checkedCombo.Visible = false;
dataGridView.Controls.Add(_checkedCombo);
// 解决 System.ArgumentException: DataGridViewComboBoxCell 值无效。 要替换此默认对话框,请处理 DataError 事件。
dataGridView.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { };
dataGridView.Paint += DataGridView_Paint;
private void _checkedCombo_TextChanged(object sender, EventArgs e)
{
if (dataGridView.CurrentCell != null)
dataGridView.CurrentCell.Value = _checkedCombo.Text;
}
private void _checkedCombo_DrawItem(object sender, DrawItemEventArgs e)
{
e.DrawBackground();
e.Graphics.DrawString(_checkedCombo.Items[e.Index].ToString(), e.Font, Brushes.Black,
e.Bounds, StringFormat.GenericDefault);
}
private void _comboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (dataGridView.CurrentCell != null)
dataGridView.CurrentCell.Value = _comboBox.Items[_comboBox.SelectedIndex];
}
// 修改数据仿照这里边的
private void DataGridView_Paint(object sender, PaintEventArgs e)
{
if (dataGridView.RowCount == 0 || dataGridView.CurrentCell == null)
{
return;
}
DataGridViewColumn column = dataGridView.CurrentCell.OwningColumn;
if (column == null)
return;
int columnIndex = dataGridView.CurrentCell.ColumnIndex;
int rowIndex = dataGridView.CurrentCell.RowIndex;
Rectangle rect = dataGridView.GetCellDisplayRectangle(columnIndex, rowIndex, false);
Debug.WriteLine("DataGridView_Paint, Rectangle:{0}, columnIndex:{1}, rowIndex:{2}", rect, columnIndex, rowIndex);
if (column.Name.Equals(colZiDuanName2.Name))
{
_checkedCombo.Left = rect.Left;
_checkedCombo.Top = rect.Top;
_checkedCombo.Width = rect.Width;
_checkedCombo.Height = rect.Height;
}
}
private void dataGridView_CurrentCellChanged(object sender, EventArgs e)
{
if (dataGridView == null || dataGridView.CurrentCell == null)
return;
DataGridViewColumn column = dataGridView.CurrentCell.OwningColumn;
if (column == null)
return;
int columnIndex = dataGridView.CurrentCell.ColumnIndex;
int rowIndex = dataGridView.CurrentCell.RowIndex;
Rectangle rect = dataGridView.GetCellDisplayRectangle(columnIndex, rowIndex, false);
Debug.WriteLine("CurrentCellChanged, Rectangle:{0}, columnIndex:{1}, rowIndex:{2}", rect, columnIndex, rowIndex);
//_checkedCombo.DataSource = new List<string> { "" };
//如果是要显示下拉列表的列的话
_comboBox.Visible = false;
if (column.Name.Equals(colZiDuanName.Name))
{
// 清空 否则会带着之前的记录过来 写在里边
_comboBox.DataSource = new List<string>{""};
_comboBox.Left = rect.Left;
_comboBox.Top = rect.Top;
_comboBox.Width = rect.Width;
_comboBox.Height = rect.Height;
string qinShiXing = dataGridView.Rows[rowIndex].Cells[colZiDuanName.Name].Value.ToString();
_comboBox.DataSource = qinShiXingStr;
if (qinShiXingStr.Contains(qinShiXing))
{
int index = _comboBox.Items.IndexOf(qinShiXing);
_comboBox.SelectedIndex = index;
}
_comboBox.Visible = true;
}
}