背景:
1、對DataGridView做了列頭初始化處理:
public static DataGridView InitDgvJobFace(ref DataGridView dgv)
{
DataGridView DgvJob = dgv;
//【BranJob】列初始化
DataGridViewCheckBoxColumn multiselect = CreateCheckColumn("multiselect", "選擇");
DataGridViewTextBoxColumn id = CreaTextBoxColumn("id", "內碼標識", "BranjobId", false);
DataGridViewComboBoxColumn jobna = CreateComboBoxColumn("jobna", "職位名稱", "Jobno");
SetAlternateChoicesUsingItems(jobna);
DataGridViewTextBoxColumn planqty = CreaTextBoxColumn("planqty", "定編人數", "Planqty");
DataGridViewTextBoxColumn jobqty = CreaTextBoxColumn("jobqty", "實際人數", "Jobqty");
DataGridViewTextBoxColumn lackqty = CreaTextBoxColumn("lackqty", "欠缺人數", "Lackqty");
DataGridViewTextBoxColumn overtime = CreaTextBoxColumn("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;
}
2、資料源加載:
public class ContextHelper
{
public static DataTable GetBranjob(string branno)
{
try
{
using(CusProContext db = new CusProContext())
{
var BranjobObj = (from p in db.BranJob
where p.Branno == branno
join a in db.JobSet on p.Jobno equals a.Jobno
select new
{
p.BranjobId,
p.Jobno,
a.Jobna,
p.Planqty,
p.Overtime
}
into x
group x by new
{
x.BranjobId,
x.Jobno,
x.Jobna,
x.Planqty,
x.Overtime
}
into y
select new
{
y.Key.BranjobId,
y.Key.Jobno, //職位編號
y.Key.Jobna, //職位名稱
y.Key.Planqty, //定編人數
Jobqty = y.Count(), //實際人數
Lackqty = y.Key.Planqty - y.Count(), //欠缺人數
Overtime = y.Sum(s => s.Overtime) //固定加班小時
}).ToList();
return LinqToDataTable(BranjobObj);
}
}
catch(Exception ex)
{
throw ex;
}
}
}
//下面是表單dgv控制元件加載:
private void InitDgvData(DataGridView dgv)
{
dgv.DataSource = ContextHelper.GetBranjob(BranObj.Branno);
}
private void Treelst_FocusedNodeChanged(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e)
{
//……(省略)
//部門職務資訊
InitDgvData(DgvJob);
}
3、對Dgv事件處理
//新行默認值
private void DgvJob_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
e.Row.Cells["multiselect"].Value = e.Row.IsNewRow;
//e.Row.Cells["jobna"].Value = "";
//可編輯
e.Row.Cells["jobna"].ReadOnly = false;
e.Row.Cells["planqty"].ReadOnly = false;
e.Row.Cells["overtime"].ReadOnly = false;
//可編輯位置背景色
e.Row.Cells["jobna"].Style.BackColor = Color.LightYellow;
e.Row.Cells["planqty"].Style.BackColor = Color.LightYellow;
e.Row.Cells["overtime"].Style.BackColor = Color.LightYellow;
}
//單元格編輯模式終止事件
private void DgvJob_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//按ESC鍵可清除行錯誤訊息。
DgvJob.Rows[e.RowIndex].ErrorText = null;
//編輯后計算列邏輯:
try
{
if (DgvJob.Rows.Count > 1)
{
//職位編號
string rowJobna = DgvJob.Rows[e.RowIndex].Cells["jobna"].Value.ToString() ?? "";
//定編人數
int rowPlanqty = DgvJob.Rows[e.RowIndex].Cells["planqty"].Value != DBNull.Value ? (int)DgvJob.Rows[e.RowIndex].Cells["planqty"].Value : 0;
//實際人數
DgvJob.Rows[e.RowIndex].Cells["jobqty"].Value = ContextHelper.FunBranJobqty(BranObj.Branno, rowJobna);
int rowJobqty = (int)DgvJob.Rows[e.RowIndex].Cells["jobqty"].Value;
//欠缺人數
DgvJob.Rows[e.RowIndex].Cells["lackqty"].Value = rowPlanqty - rowJobqty;
//MessageDxUtil.ShowTips("單元格選中值:" + rowJobqty);
}
}
catch (Exception ex)
{
MessageDxUtil.ShowTips(ex.Message);
}
}
4、添加新行的事件
private void BarBtnAddUser_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
ActState = ActionState.DetailAdd;
//判斷TabControl.Page頁面焦點位置
if (TabCtl.SelectedTab == TabCtl.TabPages[0])
{
//DgvJob
//新增空白行
DgvJob.AllowUserToAddRows = true;
}
}
呈現的UI是這樣的:

其中【職位名稱】列,是DataGridViewComboBoxColumn型別物件,DataPropertyName是jobno欄位,Name是jobna。原始碼如下:
public static DataGridView InitDgvJobFace(ref DataGridView dgv)
{
DataGridView DgvJob = dgv;
DataGridViewCheckBoxColumn multiselect = CreateCheckColumn("multiselect", "選擇");
DataGridViewComboBoxColumn jobna = CreateComboBoxColumn("jobna", "職位名稱", "Jobno");
//添加到DataGridView物件
DgvJob.Columns.AddRange(new DataGridViewColumn[]
{
id,
jobna,
//……省略
});
//插入多選[列]
DgvJob.Columns.Insert(0, multiselect);
InitDgv(DgvJob);
return DgvJob;
}
選擇列為CheckBox型別物件,沒有DataPropertyName映射值。ComboBox加載了一個子資料源,是將jobno 映射成jobna。
那么問題來了,怎么判斷新增行時ComboBox選擇項,不為表結果中存在的jobno(職位名)。
我試過用Dgv.CellValidating(單元格驗證事件)及DataError都無法判斷處理。請教有什么更簡名直接的方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/274297.html
標籤:C#
上一篇:vs專案部署到服務器上運行出錯
下一篇:網站沒有收錄怎么辦
