分为技术方面和心得体会方面。
一、技术方面:
1、更新操作时一直提示标识符无效
因为数据库中把SPEC修改为ITEM_SPEC,以为页面中字段没有改过来,调试也自己跳出,后来发现是因为update语句更新时忘了写单引号,但是这个提示也太奇怪了,驴不对马嘴的感觉。
2、返回链接问题
一个页面被刷新N次之后(查询一次刷一次,有待改进)“返回”超链接用以下代码无法返回:
<button runat="server" style="background-color:white;border:hidden;cursor:pointer" onclick="javascript:{self.location=document.referrer;return false;}" id="Button1" >
<i class="fa fa-caret-right"></i> 返回
</button>
修改为以下代码,就可以正确返回指定页面,必须加return false,否则还是返回之前页面。
<button runat="server" style="background-color:white;border:hidden;cursor:pointer" onclick="javascript:{self.location='../inv3500/inv3500.aspx';return false;}" id="Button1" >
<i class="fa fa-caret-right"></i> 返回
</button>
button上绑定javascript事件知之甚少,需要学习。
3、PerformCallback经常执行无效
原因cmbBATCH_NO只写了ID,没写ClientInstanceName
4、局部更新textbox,并设置该textbox不可修改,即只读
需要用到ASPxCallbackPanel。
<dx:ASPxCallbackPanel ID="ASPxCallbackPanel1" ClientInstanceName="stockNumCallback" runat="server" Width="100%" OnCallback="ASPxCallbackPanel1_Callback">
<PanelCollection>
<dx:PanelContent runat="server">
<dx:ASPxTextBox runat="server" ID="labStockNum" ReadOnly="true"/>
</dx:PanelContent>
</PanelCollection>
</dx:ASPxCallbackPanel>
后台获取该控件也与一般的有所区别:先需要获取ASPxCallbackPanel,再获取textbox。
ASPxTextBox labStockNum = (ASPxGridView2.FindEditFormTemplateControl("ASPxCallbackPanel1") as ASPxCallbackPanel).FindControl("labStockNum") as ASPxTextBox;
一般的:
ASPxComboBox cmbUnit = ASPxGridView2.FindEditFormTemplateControl("cmbUnit") as ASPxComboBox;
设置只读(前台设置): <dx:ASPxTextBox runat="server" ID="labStockNum" ReadOnly="true"/>
效果:正常显示,只是不能编辑。
ps: 不同于后台设置不可编辑:enabled=true
效果:整个编辑框为灰色
5、系统时间的获取方式。日期的转换。
oracle内置:sysdate,
string day = System.DateTime.Now.ToShortDateString(); //2019/5/21
需要转换后才能插入数据库中:
to_date('" + day + "', 'YYYY-MM-DD')
貌似和to_date(’" + day + "’, ‘YYYY / MM / DD’)插入数据库后没有差别。
6、自定义按钮CustomButtons
<dx:GridViewCommandColumn Caption="操作" Width="100px" FixedStyle="Left" ShowClearFilterButton ="true">
<CustomButtons>
<dx:GridViewCommandColumnCustomButton Text="确认    " ID="Confirm"/>
<dx:GridViewCommandColumnCustomButton Text="撤销" ID="Delete"/>
</CustomButtons>
</dx:GridViewCommandColumn>
<dx:GridViewCommandColumn Caption="生成质检单">
<CustomButtons>
<dx:GridViewCommandColumnCustomButton ID="createCheckBill" Text="生成质检单"></dx:GridViewCommandColumnCustomButton>
</CustomButtons>
</dx:GridViewCommandColumn>
结果是这样:
自定义按钮对应的事件写在gridview的OnCustomButtonCallback中,用buttons的ID来判断哪个按钮。
后台事件处理代码:
protected void ASPxGridView1_CustomButtonCallback(object sender, ASPxGridViewCustomButtonCallbackEventArgs e)
{
ASPxGridView grid = sender as ASPxGridView;
//确认
if (e.ButtonID == "Confirm")
{
grid.JSProperties.Add("cpCallbackName", "Confirm");
string billCode = grid.GetRowValues(e.VisibleIndex, "BILL_CODE").ToString();
string sql = "UPDATE INV_BILL_INOUT SET CONFIRM_STATUS='Y',CONFIRM_USER_ID='" + theUseId + "',CONFIRM_USER_NAME='" + theUserName + "',CONFIRM_TIME=sysdate WHERE COMPANY_CODE='" + theCompanyCode + "' AND BILL_CODE='" + billCode + "'";
dc.ExeSql(sql);
initGrid();
grid.JSProperties.Add("cpMessage", "确认成功!");
}
想弹出提示信息,需要在前台用ClientSideEvents的EndCallback和BeginCallback事件。需要注意的是,无论后台的CustomButtonCallback是否执行,EndCallback和BeginCallback事件都会执行,所以单纯在前台用alert来测试后台事件是否执行不可行。
<ClientSideEvents EndCallback="function(s,e){
callbackName = grid.cpCallbackName;
if(callbackName=='Confirm'){
message = grid.cpMessage;
alert(message);
}
if(callbackName=='Delete'){
message=grid.cpMessage;
alert(message);
}
}" BeginCallback="function(s,e){grid.cpCallbackName='';}" />
7、PLSQL的常用操作:select * from user_objects
当前用户的所有对象,包含四列值object_id,object_name,object_type,oracle_maintained
https://blog.csdn.net/cacasi2568/article/details/8047343
select count(*) from user_objects 查看当前用户一共有多少个对象
8、excel导入数据问题
日期格式数据出现乱码,无法转换成DateTime类型。
https://blog.csdn.net/qq_26572075/article/details/80930756
用NPOI做excel导入时,DateTime在NPOI中的类型是Numeric ,判断如果是Numeric 类型的话再用.Net自带的DateUtil.IsCellDateFormatted(cell)方法判断是否为DateTime类型,如果2个都成立,取cell的DateCellValue属性
if ( row.GetCell(j).CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(row.GetCell(j)))
{
dataRow[j] = row.GetCell(j).DateCellValue;
}
或者:
if (cell.CellType == CellType.Numeric)
{
//content = cell.NumericCellValue.ToString();
short format = cell.CellStyle.DataFormat;
if (format != 0) { content = cell.DateCellValue.ToString(); }
else { content = cell.NumericCellValue.ToString(); }
}
9、combobox与multiple columns
效果:
代码实现:用ListBoxColumn
<dx:ASPxComboBox runat="server" ID="cmbITEM_CODE" Width="100%" ValidationSettings-ValidationGroup = " <%# Container.ValidationGroup %>" OnInit="cmbITEM_CODE_Init">
<Columns>
<dx:ListBoxColumn Caption="存货编码" FieldName="ITEM_CODE"></dx:ListBoxColumn>
<dx:ListBoxColumn Caption="存货名称" FieldName="ITEM_NAME"></dx:ListBoxColumn>
<dx:ListBoxColumn Caption="规格" FieldName="ITEM_SPEC"></dx:ListBoxColumn>
<dx:ListBoxColumn Caption="型号" FieldName="ITEM_MODEL"></dx:ListBoxColumn>
<dx:ListBoxColumn Caption="主计量单位" FieldName="UNIT_CODE"></dx:ListBoxColumn>
</Columns>
</dx:ASPxComboBox>
需要注意的是:保证每一行有一个唯一值,不能一对多,否则取数据会有问题。
combobox综合了textbox和listbox的特性,既可选择又可以输入。
10、listedit
下拉列表里设置多个项
<dx:ASPxComboBox runat="server" ID="cmbBUS_TYPE" Width="100%" ValidationSettings-ValidationGroup = " <%# Container.ValidationGroup %>">
<Items>
<dx:ListEditItem Value="A" Text="业务1" />
<dx:ListEditItem Value="B" Text="业务2" />
<dx:ListEditItem Value="C" Text="业务3" />
</Items>
<ValidationSettings ErrorDisplayMode="ImageWithTooltip">
<RequiredField ErrorText="不能为空." IsRequired="True" />
</ValidationSettings>
</dx:ASPxComboBox>
心得体会方面
1、业务流程才是最复杂的,搞懂业务流程,写代码就很简单啦。
2、之所以工作效率低时因为不懂业务流程。