110,570
社区成员
发帖
与我相关
我的任务
分享
private void Page_Channel_Load(object sender, EventArgs e)
{
uiDataGridView1.AddColumn("序号", "Column1").SetFixedMode(70);
uiDataGridView1.AddColumn("Station", "Column2");
uiDataGridView1.AddColumn("ECD(us)", "Column3");
uiDataGridView1.AddColumn("FLD(dBuV)", "Column4");
uiDataGridView1.AddColumn("Tran(us)", "Column5");
uiDataGridView1.AddColumn("Base(us)", "Column6");
uiDataGridView1.AddColumn("1SkyFLD", "Column7");
uiDataGridView1.AddColumn("1Delay(us)", "Column8");
uiDataGridView1.AddColumn("2SkyFLD", "Column9");
uiDataGridView1.AddColumn("2Delay(us)", "Column10");
uiDataGridView1.ReadOnly = true;
}
public class Data
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
public string Column4 { get; set; }
public string Column5 { get; set; }
public string Column6 { get; set; }
public string Column7 { get; set; }
public string Column8 { get; set; }
public string Column9 { get; set; }
public string Column10 { get; set; }
public override string ToString()
{
return Column1;
}
}
//更新DataGridView的函数,
public void Update_chain_Info(LSCHM_Decode_T chain_info)
{
DataGridViewRow row = new DataGridViewRow();
row.CreateCells(uiDataGridView1);
//num为唯一标识符,如果标识符相同,则更新该行数据,而不是插入新行
row.Cells[0].Value = num.ToString();
row.Cells[1].Value = chain_info.period + " " + chain_info.state;
row.Cells[2].Value = chain_info.ecd;
row.Cells[3].Value = chain_info.fld;
row.Cells[4].Value = chain_info.transport_delay;
row.Cells[5].Value = chain_info.base_delay;
row.Cells[6].Value = chain_info.one_sky_fld;
row.Cells[7].Value = chain_info.one_sky_delay;
row.Cells[8].Value = chain_info.two_sky_delay;
row.Cells[9].Value = chain_info.two_sky_fld;
uiDataGridView1.Rows.Add(row);
}
当Update或Insert值之后,需要写入数据源。一般数据源是泛型,比如下面的demo是List<BranJob>,是往DB方向读写的。 你要做的事情,就是Update或Insert将值写入数据源之后,要进行Dgv重置,重载数据源。 而重载数据源,涉及到三个部分: 1、数据源表,可以为DataTable,也可以是泛型,当然也可以是象你这样,以DataRow或DataGridViewRow类型向dgv来插入。 2、Dgv表头,也就是表的列头可以重新装载,也可以不清空(这句:DgvJob.Columns.Clear();),一般来讲,重载表头一般是有对表样式重新配置的需求。(也就是Rows、Columns或Cells的DefaultCellStyle属性,当然也可以给全表配置一个默认样式,如:dgv.DefaultCellStyle) 3、事件的订阅和撤销。这部分的东西就非常多了。如果是后台逻辑来处理行、单元格值的更新或插入,那可以忽略。象你写的就是这种情况///Dgv数据源重置 /// <summary> /// 重置DgvJob对象 /// </summary> private void ResetDgvJobSet() { //清空 DgvJob.DataSource = null; DgvJob.Rows.Clear(); DgvJob.Columns.Clear(); //复位 //DgvJob.SelectionMode = DataGridViewSelectionMode.CellSelect; //DgvJob.CellMouseClick -= new DataGridViewCellMouseEventHandler(DgvJob_CellMouseClick); //重载 DgvJob.AllowUserToAddRows = false; DataGridViewHelper.InitDgvJobFace(ref DgvJob); InitDgvData(DgvJob); } /// <summary> /// DataGridView控件辅助类 /// </summary> public class DataGridViewHelper { public static DataGridView InitDgvJobFace(ref DataGridView dgv) { //【BranJob】列初始化 DataGridViewCheckBoxColumn multiselect = CreateCheckColumn("multiselect", "选择"); DataGridViewTextBoxColumn id = CreateTextBoxColumn("id", "内码标识", "BranjobId", false); DataGridViewComboBoxColumn jobna = CreateComboBoxColumn("jobna", "职位名称", "Jobno"); SetAlternateChoicesUsingItems(jobna); DataGridViewTextBoxColumn planqty = CreateTextBoxColumn("planqty", "定编人数", "Planqty"); DataGridViewTextBoxColumn jobqty = CreateTextBoxColumn("jobqty", "实际人数", "Jobqty"); DataGridViewTextBoxColumn lackqty = CreateTextBoxColumn("lackqty", "欠缺人数", "Lackqty"); DataGridViewTextBoxColumn overtime = CreateTextBoxColumn("overtime", "固定加班小时", "Overtime"); //overtime.DefaultCellStyle = CellStyle(CellStyleState.decimalCellStyle); //添加到DataGridView对象 DgvJob.Columns.AddRange(new DataGridViewColumn[] { id, jobna, planqty, jobqty, lackqty, overtime }); //插入多选[列] DgvJob.Columns.Insert(0, multiselect); InitDgv(DgvJob); return DgvJob; } /// <summary> /// 初始化Dgv格式样式 /// </summary> /// <param name="dgv"></param> private static void InitDgv(DataGridView dgv) { dgv.EnableHeadersVisualStyles = false; dgv.AutoGenerateColumns = false; //dgv.RowHeadersVisible = false; //默认单元格样式 //dgv.DefaultCellStyle = CellStyle(CellStyleState.textCellStyle); //默认行标题样式 //dgv.RowHeadersDefaultCellStyle = CellStyle(CellStyleState.rowHeaderCellStyle); dgv.RowTemplate.Height = 23; //默认行高 dgv.AllowUserToAddRows = false; //禁止新增列 dgv.EditMode = DataGridViewEditMode.EditOnEnter; dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //列标题居中 //dgv.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //列顺序调整 dgv.AllowUserToOrderColumns = false; } /// <summary> /// 创建基于DataGridView文本控件 /// </summary> /// <param name="TextName">对象Name</param> /// <param name="HeaderCaption">对象HeaderText</param> /// <param name="DataFieldName">对象DataPropertyName</param> /// <returns></returns> private static DataGridViewTextBoxColumn CreateTextBoxColumn(string TextName, string HeaderCaption, string DataFieldName, bool visible = true) { DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn() { Name = TextName, HeaderText = HeaderCaption, DataPropertyName = DataFieldName, SortMode = DataGridViewColumnSortMode.NotSortable, ReadOnly = true, Visible = visible }; return column; } /// <summary> /// 创建基于DataGridView下拉列表控件 /// </summary> /// <param name="CmbBoxName">对象Name</param> /// <param name="HeaderCaption">对象HeaderText</param> /// <param name="DataFieldName">对象DataPropertyName</param> /// <returns></returns> private static DataGridViewComboBoxColumn CreateComboBoxColumn(string CmbBoxName, string HeaderCaption, string DataFieldName) { DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn() { Name = CmbBoxName, HeaderText = HeaderCaption, DataPropertyName = DataFieldName, FlatStyle = FlatStyle.Popup, SortMode = DataGridViewColumnSortMode.NotSortable, ReadOnly = true }; return column; } /// <summary> /// 创建基于DataGridView多选CheckBox控件 /// </summary> /// <param name="ChkName">对象Name</param> /// <param name="HeaderCaption">对象HeaderText</param> /// <param name="DataFieldname">对象DataPropertyName</param> /// <returns></returns> private static DataGridViewCheckBoxColumn CreateCheckColumn(string ChkName, string HeaderCaption, string DataFieldname = null) { DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn() { Name = ChkName, HeaderText = HeaderCaption, DataPropertyName = DataFieldname, SortMode = DataGridViewColumnSortMode.NotSortable, TrueValue = false, ReadOnly = true, AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells, FlatStyle = FlatStyle.Standard, CellTemplate = new DataGridViewCheckBoxCell() }; column.CellTemplate.Style.BackColor = Color.Beige; return column; } }
BindingList<> 更具有优势,相比较list,另外无论是添加或者更新,先去用主键做查询不就知道了么?集合都支持lamda表达式的,直接list.firstordefault ,r默认如果没有就添加,如果有就是更新
不建议操作,DataGridView1.Rows,挺麻烦的事。直接操作datatable, 你现在要学习的就是怎么操作datatable,给你一个思路 DataTable dt = new DataTable(); dt.Columns.Add("col", typeof(int)); //假如dt里有数据 this.dataGridView1.DataSource = dt; //添加数据 DataRow dataRow = dt.NewRow(); dataRow[0] = 1; dt.Rows.Add(dataRow); //修改数据 dt.Rows[0].ItemArray = new object[] { 2 }; //删除数据 dt.Rows.RemoveAt(0); //最后这句,即更新datatable及datagrid界面的内容 dt.AcceptChanges();
bool isupdate = false;
int maxline = 0;
int maxline_record = 0;
bool isrecord = true;
public void Update_chain_Info(LSCHM_Decode_T chain_info)
{
DataRow dr = dt.NewRow();
dr[0] = num;
dr[1] = chain_info.period + " " + chain_info.state;
dr[2] = chain_info.ecd;
dr[3] = chain_info.fld;
dr[4] = chain_info.transport_delay;
dr[5] = chain_info.base_delay;
dr[6] = chain_info.one_sky_fld;
dr[7] = chain_info.one_sky_delay;
dr[8] = chain_info.two_sky_delay;
dr[9] = chain_info.two_sky_fld;
//如果行数大于num序列,就让他更新存在的行序列。而不需要再插入了。 否则就插入新行
if (dt.Rows.Count >= num)
{
dt.Rows[num - 1].ItemArray = new object[] {
num,
chain_info.period + " " + chain_info.state,
chain_info.ecd,
chain_info.fld,
chain_info.transport_delay,
chain_info.base_delay,
chain_info.one_sky_fld,
chain_info.one_sky_delay,
chain_info.two_sky_delay,
chain_info.two_sky_fld };
dt.AcceptChanges();//更新行
}
else
{
dt.Rows.Add(dr);
}
//所有的行都加入datatable中后,进来一次
if (isupdate)
{
if (isrecord) //只会进来一次,记住当前最大的行数
{
maxline_record = maxline;
isrecord = false;
//清除默认选中一行
uiDataGridView1.ClearSelection();//没起作用
}
//如果计算的最大行数,不等于上一次的最大的行数。就进去删除已经没有的行
if (maxline != maxline_record)
{
isrecord = true;
if (maxline < maxline_record)
{
int a = uiDataGridView1.Rows.Count;
//例如由10行减少到7行,则需要删除8、9、10行。不然还在datagridview中显示着。
for (int i = 1; i <= Math.Abs(maxline_record - maxline); i++)
{
dt.Rows.RemoveAt(a - i);
}
}
}
//所有行统计清零,重新计算
maxline = 0;
}
}
DataTable dt = new DataTable();
private void Page_Channel_Load(object sender, EventArgs e)
{
dt.Columns.Add("序号", typeof(string));
dt.Columns.Add("Station", typeof(string));
dt.Columns.Add("ECD(us)", typeof(string));
dt.Columns.Add("FLD(dBuV)", typeof(string));
dt.Columns.Add("Tran(us)", typeof(string));
dt.Columns.Add("Base(us)", typeof(string));
dt.Columns.Add("1Delay(us)", typeof(string));
dt.Columns.Add("1SkyFLD", typeof(string));
dt.Columns.Add("2Delay(us)", typeof(string));
dt.Columns.Add("2SkyFLD", typeof(string));
uiDataGridView1.DataSource = dt;
uiDataGridView1.Columns[0].FillWeight = 70;
uiDataGridView1.Columns[1].FillWeight = 90;
//清除默认选中一行
uiDataGridView1.ClearSelection();//没起作用
}
不好意思啊,可能我没表达好。你就当只有四行数据,我不需要再插入新行了,后面的数据只需要更新这四行数据就行了。感谢感谢
///Dgv数据源重置
/// <summary>
/// 重置DgvJob对象
/// </summary>
private void ResetDgvJobSet()
{
//清空
DgvJob.DataSource = null;
DgvJob.Rows.Clear();
DgvJob.Columns.Clear();
//复位
//DgvJob.SelectionMode = DataGridViewSelectionMode.CellSelect;
//DgvJob.CellMouseClick -= new DataGridViewCellMouseEventHandler(DgvJob_CellMouseClick);
//重载
DgvJob.AllowUserToAddRows = false;
DataGridViewHelper.InitDgvJobFace(ref DgvJob);
InitDgvData(DgvJob);
}
/// <summary>
/// DataGridView控件辅助类
/// </summary>
public class DataGridViewHelper
{
public static DataGridView InitDgvJobFace(ref DataGridView dgv)
{
//【BranJob】列初始化
DataGridViewCheckBoxColumn multiselect = CreateCheckColumn("multiselect", "选择");
DataGridViewTextBoxColumn id = CreateTextBoxColumn("id", "内码标识", "BranjobId", false);
DataGridViewComboBoxColumn jobna = CreateComboBoxColumn("jobna", "职位名称", "Jobno");
SetAlternateChoicesUsingItems(jobna);
DataGridViewTextBoxColumn planqty = CreateTextBoxColumn("planqty", "定编人数", "Planqty");
DataGridViewTextBoxColumn jobqty = CreateTextBoxColumn("jobqty", "实际人数", "Jobqty");
DataGridViewTextBoxColumn lackqty = CreateTextBoxColumn("lackqty", "欠缺人数", "Lackqty");
DataGridViewTextBoxColumn overtime = CreateTextBoxColumn("overtime", "固定加班小时", "Overtime");
//overtime.DefaultCellStyle = CellStyle(CellStyleState.decimalCellStyle);
//添加到DataGridView对象
DgvJob.Columns.AddRange(new DataGridViewColumn[]
{
id,
jobna,
planqty,
jobqty,
lackqty,
overtime
});
//插入多选[列]
DgvJob.Columns.Insert(0, multiselect);
InitDgv(DgvJob);
return DgvJob;
}
/// <summary>
/// 初始化Dgv格式样式
/// </summary>
/// <param name="dgv"></param>
private static void InitDgv(DataGridView dgv)
{
dgv.EnableHeadersVisualStyles = false;
dgv.AutoGenerateColumns = false;
//dgv.RowHeadersVisible = false;
//默认单元格样式
//dgv.DefaultCellStyle = CellStyle(CellStyleState.textCellStyle);
//默认行标题样式
//dgv.RowHeadersDefaultCellStyle = CellStyle(CellStyleState.rowHeaderCellStyle);
dgv.RowTemplate.Height = 23; //默认行高
dgv.AllowUserToAddRows = false; //禁止新增列
dgv.EditMode = DataGridViewEditMode.EditOnEnter;
dgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; //列标题居中
//dgv.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
//列顺序调整
dgv.AllowUserToOrderColumns = false;
}
/// <summary>
/// 创建基于DataGridView文本控件
/// </summary>
/// <param name="TextName">对象Name</param>
/// <param name="HeaderCaption">对象HeaderText</param>
/// <param name="DataFieldName">对象DataPropertyName</param>
/// <returns></returns>
private static DataGridViewTextBoxColumn CreateTextBoxColumn(string TextName, string HeaderCaption, string DataFieldName, bool visible = true)
{
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn()
{
Name = TextName,
HeaderText = HeaderCaption,
DataPropertyName = DataFieldName,
SortMode = DataGridViewColumnSortMode.NotSortable,
ReadOnly = true,
Visible = visible
};
return column;
}
/// <summary>
/// 创建基于DataGridView下拉列表控件
/// </summary>
/// <param name="CmbBoxName">对象Name</param>
/// <param name="HeaderCaption">对象HeaderText</param>
/// <param name="DataFieldName">对象DataPropertyName</param>
/// <returns></returns>
private static DataGridViewComboBoxColumn CreateComboBoxColumn(string CmbBoxName, string HeaderCaption, string DataFieldName)
{
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn()
{
Name = CmbBoxName,
HeaderText = HeaderCaption,
DataPropertyName = DataFieldName,
FlatStyle = FlatStyle.Popup,
SortMode = DataGridViewColumnSortMode.NotSortable,
ReadOnly = true
};
return column;
}
/// <summary>
/// 创建基于DataGridView多选CheckBox控件
/// </summary>
/// <param name="ChkName">对象Name</param>
/// <param name="HeaderCaption">对象HeaderText</param>
/// <param name="DataFieldname">对象DataPropertyName</param>
/// <returns></returns>
private static DataGridViewCheckBoxColumn CreateCheckColumn(string ChkName, string HeaderCaption, string DataFieldname = null)
{
DataGridViewCheckBoxColumn column = new DataGridViewCheckBoxColumn()
{
Name = ChkName,
HeaderText = HeaderCaption,
DataPropertyName = DataFieldname,
SortMode = DataGridViewColumnSortMode.NotSortable,
TrueValue = false,
ReadOnly = true,
AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells,
FlatStyle = FlatStyle.Standard,
CellTemplate = new DataGridViewCheckBoxCell()
};
column.CellTemplate.Style.BackColor = Color.Beige;
return column;
}
}
找到与 num 对应的 uiDataGridView1.Rows 的序号:index uiDataGridView1.Rows[index]= row; erbushijiandande uiDataGridView1.Rows.Add(row); 一加了之
datagrid.datasource 绑定 datatable , 然后直接更新datatable的行就可以了, 在datagrid上操作数据麻烦,而且容易出错,你现在不就出错了,这错莫名其妙的
我都没完全看明白,你的完整需求。 只说明了,表行的insert或update,是由行标识1、2、3、4来判断。 如果标识相同,即为update,如果标识不存在,即为insert。 那我想问一句,那第一个图是怎么理解,标识1234,出现3次相同的数据行?
[quote=引用 3 楼 这也不能运行不是吧 的回复:] 不好意思啊,可能我没表达好。你就当只有四行数据,我不需要再插入新行了,后面的数据只需要更新这四行数据就行了。感谢感谢
Data data = new Data();
data.Column1 = num.ToString();
data.Column2 = chain_info.period + " " + chain_info.state;
data.Column3 = chain_info.ecd;
data.Column4 = chain_info.fld;
data.Column5 = chain_info.transport_delay;
data.Column6 = chain_info.base_delay;
data.Column7 = chain_info.one_sky_fld;
data.Column8 = chain_info.one_sky_delay;
data.Column9 = chain_info.two_sky_delay;
data.Column10 = chain_info.two_sky_fld;
if (datas.Exist(num-1))
{
datas.Update(num - 1, data);
}
else
{
datas.Add(data);
}
if (isupdate)
{
uiDataGridView1.DataSource = datas;
uiDataGridView1.Refresh();
}
根据你说的,更新问题解决了。感谢感谢。又有新问题了,数据从4组变成了3组,datagridview还显示4组,不知道怎么实时变化