温馨提示:
以下代码无法直接复制粘贴使用,主要是其中用到的思路================
1.删除
/// <summary>
/// 删除列表中指定行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripButton7_Click(object sender, EventArgs e)
{
if (skinDataGridView1.CurrentRow != null)
{
// 获取当前选中行索引
int currentIndex = skinDataGridView1.CurrentRow.Index;
// 获取当前选中行银行编码
string fNumber = skinDataGridView1.Rows[currentIndex].Cells[0].Value.ToString();
// 询问是否需要保存修改的内容
DialogResult TS = MessageBox.Show("是否删除[" + fNumber + "]数据?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (TS == DialogResult.Yes)
{
int count = deleteData(fNumber);
if (count > 0)
{
MessageBox.Show("删除成功");
}
else
{
MessageBox.Show("删除失败");
}
// 异步刷新数据列表
refrenceData();
}
}
}
/// <summary>
/// 列表刷新委托
/// </summary>
public delegate void DataGridViewDelegateRefresh();
/// <summary>
/// 异步刷新数据列表
/// </summary>
public void refrenceData()
{
// 异步刷新数据列表
BeginInvoke(new DataGridViewDelegateRefresh(setDataGridViewData));
}
/// <summary>
/// 收款银行列表赋值
/// </summary>
private void setDataGridViewData()
{
// 查询所有收款银行数据信息
List<TBankInfo> bankInfoList = selectData("");
if (bankInfoList == null || bankInfoList.Count <= 0)
{
return;
}
skinDataGridView1.Rows.Clear();
this.Column4.Items.Clear();
this.Column4.Items.Add("是");
this.Column4.Items.Add("否");
foreach (var item in bankInfoList)
{
// 获取最新行的索引
int index = skinDataGridView1.Rows.Add();
skinDataGridView1.Rows[index].Cells[0].Value = item.fNumber + "";
skinDataGridView1.Rows[index].Cells[1].Value = item.fName + "";
skinDataGridView1.Rows[index].Cells[2].Value = item.fBankNumber + "";
//skinDataGridView1.Rows[index].Cells[3].Value = item.fDefault + "";
/*DataGridViewCell acell = skinDataGridView1.Rows[index].Cells[3];
DataGridViewComboBoxCell acombbox = acell as DataGridViewComboBoxCell;
acombbox.Items.Add("是");
acombbox.Items.Add("否");*/
((DataGridViewComboBoxCell)skinDataGridView1.Rows[index].Cells[3]).Style.NullValue = (item.fDefault == 1)?"是":"否";
skinDataGridView1.Rows[index].Cells[4].Value = item.fNote + "";
}
// 设置第4列禁止编辑
//skinDataGridView1.Columns[3].ReadOnly = true;
}
2.修改
使用CellParsing(退出单元格编辑后发生)方法
/// <summary>
/// 退出单元格编辑后发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void skinDataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
// 获取编辑之前得银行编码
string oldFNumberText = skinDataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
// 根据银行编码查询当前银行数据信息
List<TBankInfo> list = selectData(oldFNumberText);
TBankInfo bankInfo = list[0];
// 获取编辑之前的单元格内容
string oldCellText = bankInfo.fDefault + "";
// 如果不是下拉框
if (e.ColumnIndex != 3)
{
oldCellText = skinDataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
}
// 获取编辑之后的单元格内容
string newCellText = e.Value.ToString();
// 如果为true,表示内容未改变
if (!string.Equals(oldCellText, newCellText))
{
// 询问是否需要保存修改的内容
DialogResult TS = MessageBox.Show("是否保存[" + newCellText + "]?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (TS == DialogResult.Yes)
{
// 保存新内容
switch (e.ColumnIndex)
{
// 银行编码
case 0:
List<TBankInfo> list1 = selectData(newCellText);
if (list1.Count > 0)
{
MessageBox.Show("[" + newCellText + "]已经存在!");
// 异步刷新数据列表
refrenceData();
return;
}
bankInfo.fNumber = newCellText;
break;
// 银行名称
case 1:
bankInfo.fName = newCellText;
break;
// 银行账号
case 2:
bankInfo.fBankNumber = newCellText;
break;
// 默认
case 3:
bankInfo.fDefault = int.Parse(string.Equals("是", newCellText) ? "1" : "0");
if (string.Equals("是", newCellText))
{
updateDataFDefault(bankInfo.fNumber, 0);
}
break;
// 备注
case 4:
bankInfo.fNote = newCellText;
break;
}
int index = updateData(bankInfo, oldFNumberText);
if (index < 1)
{
MessageBox.Show("修改失败");
}
else
{
MessageBox.Show("修改成功");
}
}
// 异步刷新数据列表
refrenceData();
}
}
3.新增
新增的话,本人是选择使用调用窗口的方式处理的。
中间最关键的问题在于内容填写之后,怎么将值传递给调用的窗口。
A.如果新增窗口时调用者的子窗口,那就好办了,可以直接在新增窗口保存数据按钮触发事件的时候调用到主窗口:this.parent.....
B.如果该新增窗口是一个独立的窗口,有两种方法:
a.在调用窗口添加一个定时器,并且在公共类里面添加一个bool类型的锁。当调用窗口点击新增的时候,开启定时器(定时器每200毫秒查询一次锁是否被关闭),并开启保护锁(锁的作用是为了告诉定时器,数据是否新增完毕,如果新增完毕就关闭锁),当锁被关闭后,并且被定时器扫描到,就直接刷新列表,这样就有了数据传递的效果,当然刷新列表之后一定要关闭定时器哦,不然后果很严重的。
b.使用公共静态类,把调用窗口对象放在静态类里面。之后就可以直接在新增窗口的各个事件中,直接调用该对象,从而实现数据传递。注意一定要是静态的。
4.DataGridView简单的操作可以看这里