C#、Form窗体DataGradView中自定义单选和多选

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;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤道士

您的认可是我最快乐的事情,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值