cell触发事件的先后顺序:
①不进行cell编辑情况时:
CellEnter-->CellLeave-->CellValidating-->CellValidated
②对cell进行编辑后:
CellEnter-->CellBeginEdit-->CellLeave-->CellValidating-->CellValueChanged-->CellValidated-->CellEndEdit
1.从数据库中读取下拉列表数据
/// <summary>
/// 新添加行时显示下拉框
/// </summary>
private void dgvShowCombobox()
{
//传感器小类
DataGridViewComboBoxCell dgvSnrStyleCombox = new DataGridViewComboBoxCell();
string sqlSensorType = "SELECT sensorType,sensorStyle FROM sensorstyle";
MySqlDataAdapter cbxAdapter = MySQLConnect.GetMySQLDB().getAdapter(sqlSensorType);
DataSet dtSensorTypeCombox = new DataSet();
cbxAdapter.Fill(dtSensorTypeCombox, "sensorstyle");
dgvSnrStyleCombox.DataSource = dtSensorTypeCombox.Tables["sensorstyle"];
dgvSnrStyleCombox.DisplayMember = "sensorStyle";
dgvSenserManage.Rows[dgvSenserManage.Rows.Count - 1].Cells[2] = dgvSnrStyleCombox;
}
2.下拉框改变时触发事件
#region 对dgv中的下拉框操作
/// <summary>
/// dgv中DataGridViewComboBoxCell编辑事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgvSenserManage_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridView dgv = sender as DataGridView;
//判断相应的列
if (dgv.CurrentCell.GetType().Name == "DataGridViewComboBoxCell" && dgv.CurrentCell.RowIndex != -1)
{
//给这个DataGridViewComboBoxCell加上下拉事件
(e.Control as ComboBox).SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
}
}
/// <summary>
/// 组合框事件处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox combox = sender as ComboBox;
combox.Leave += new EventHandler(combox_Leave);
try
{
//在这里就可以做值是否改变判断
if (combox.SelectedItem != null)
{
//MessageBox.Show("在这里做获取选中值赋值到大类中的操作", "提示");
int currentColumn = (int)dgvSenserManage.CurrentCell.ColumnIndex;
if (currentColumn == 2) //传感器小类
{
String snrStyleCurrentValue = ((DataRowView)(combox.SelectedItem)).Row.ItemArray.GetValue(0).ToString();
string sql = string.Format("SELECT sensorType FROM sensorstyle WHERE sensorStyle='{0}'", snrStyleCurrentValue);
MySqlCommand command = MySQLConnect.GetMySQLDB().giveCommand(sql);
//StringmysqlStr="Database=GuGong;DataSource=127.0.0.1;UserId=root;Password=123456;pooling=false;CharSet=utf8;port=3306";//连接数据库是注意设置编码
//MySqlConnection mysql = new MySqlConnection(mysqlStr);
//MySqlCommand mysqlCommand = new MySqlCommand(sql, mysql);
//mysql.Open();
//MySqlDataReader reader = command.ExecuteReader();
//string snrType = "";
//while (reader.Read())
//{
// if (reader.HasRows)//有一行读一行
// {
// snrType = (string)reader["sensorType"];
// }
//}
//dgvSenserManage.CurrentRow.Cells["sensorType"].Value = snrType;
object obj = command.ExecuteScalar();
if (obj != null)
{
String snrType = obj.ToString();
dgvSenserManage.CurrentRow.Cells["sensorType"].Value = snrType;
}
}
if(currentColumn == 3) //厂家全称
{
}
}
//Thread.Sleep(100);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 离开combox时,把事件删除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void combox_Leave(object sender, EventArgs e)
{
ComboBox combox = sender as ComboBox;
//做完处理,须撤销动态事件
combox.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
}
#endregion
3.在此单元格失去焦点后单元格内值更改触发事件
/// <summary>
/// 单元格中的值改变时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgvSenserManage_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) return;
if (e.RowIndex < 0 || e.ColumnIndex < 0) return;
DataGridViewComboBoxCell cc;
if (e.ColumnIndex == 2) //ComboBoxCell列传感器小类
{
cc = (DataGridViewComboBoxCell)this.dgvSenserManage.CurrentCell;
if (cc.Value != null)
{
string dgvCell = Convert.ToString(dgvSenserManage.CurrentCell.Value);
MessageBox.Show(dgvCell);
}
}
}