button、dateField、textField

本文深入解析了按钮、日期字段和文本字段在JavaScript中的禁用机制和逻辑赋值过程,包括按钮禁用、日期字段获取值、文本字段赋值为逻辑值,并讨论了它们在实际应用中的注意事项。

=发=

一、button

1、Bean里禁用与启用----------------------<w:button value="增 加" id="btnAdd" jsvar="btnAddJS" width="80" disabled="true"></w:button>

Browser.execClientScript("btnAddJS.enable();");//无效   ------------ 闪一下,又恢复

Browser.execClientScript("btnAddJS.disbale();");//无效    ------------闪一下,又恢复

Browser.execClientScript("btnAddJS.enable();return false;");//---提示错误:return在函数之外

@Bind(id="btnAdd", attribute="binding")

private UIButton btnAdd_binding;  

。。。 。。。

btnAdd_binding.setDisabled(false);

btnAdd_binding.setDisabled(true);   //-----------------有效

@Bind(id="btnAdd", attribute="disabled")

private boolean btnAdd_disabled;

。。。 。。。

btnAdd_disabled=true;

btnAdd_disabled=false;   //---------------无效

2、JS禁用

btnAddJS.enable();

btnModJS.disable();    //---------------有效,但启用后  按钮无法执行bean中action里的方法


3、button同时设置disbale=true和immediate=true属性后,按钮是灰色、但实际可以单击、且单击后仍不能跳过校验???



二、dateField

        1、JS取值

<w:dateField id="XXLRSJ1" jsvar="XXLRSJ1" width="130" requiredMessage="起始审核日期不能为空!" required="true" fieldLabel="起始  ">  
    <f:convertDateTime pattern="yyyy年MM月dd日" timeZone="GMT+8" />                
</w:dateField>

jsvar.value--------------------------------Fub 。。。Gst。。。2012
jsvar.getValue()-------------------------2012年02月02日


三、textField

1、隐藏域赋逻辑值

@Bind(id="lrTag", attribute="value")
	private boolean lrTag_value=false;
<w:textField id="lrTag" jsvar="lrTag" hidden="true"/>
。。。 。。。
alert(sr[0].get('pass')==null);    //true
alert(lrTag.getValue()=='false');  //true
alert(lrTag.getValue()==false);    //false

----------------------------即JS中取到的逻辑值是“字符串”,要用字符串进行比较




<%@ Control Language="C#" AutoEventWireup="true" CodeFile="AMA_IMD_Control.ascx.cs" Inherits="RTD_UserControl_AMA_IMD_Control" %> <link href="../Styles/ExtFontSytle.css" type="text/css" rel="stylesheet" /> <script type="text/javascript"> var changes = function (value, metaData, r) { var date = new Date(r.data.ENDTIME) if (date.getTime() < new Date()) { var mystyle = 'background-color: #808080;'; metaData.style = mystyle + ""; return value; } else { // var mystyle = 'background-color:#FFFFFF;'; metaData.style = mystyle + ""; return value; } }; var resetNewUserForm = function (form) { // Reset Form Fields form.getForm().reset(); App.NewIDLEINTERVALTF.setDisabled(false); // Re-enable UserIdTF to allow inputs while creating New Users App.NewIDTF.setDisabled(true); // Enable/Disable buttons App.NewUserSaveBtn.setDisabled(true); App.NewUserDeleteBtn.setDisabled(true); App.NewUserCreateBtn.setDisabled(false); }; var assignNewbatchToolControlFields = function (record) { App.NewIDTF.setValue(record.data.ID); App.NewCONTROLIDTF.setValue(record.data.CONTROLID); App.NewINTERVALTF.setValue(record.data.INTERVAL); App.NewCONTROLLOGICALTF.setValue(record.data.CONTROLLOGICAL); App.NewCONTROLVALUETF.setValue(record.data.CONTROLVALUE); App.NewCONTROLINTERVALTF.setValue(record.data.CONTROLINTERVAL); App.NewLEADINGTIMETF.setValue(record.data.LEADINGTIME); App.NewINITIALTIMETF.setValue(record.data.INITIALTIME); App.NewSTARTTIMETF.setValue(record.data.STARTTIME); App.NewENDTIMETF.setValue(record.data.ENDTIME); App.NewSETTINGAREATF.setValue(record.data.SETTINGAREA); // App.NewIDTF.setValue(record.data.ID); //if (record.data.ISALLOWNEXT == 'Prefer' || record.data.ISALLOWNEXT == 'NonPrefer') { // App.NewIDLEINTERVALTF.setDisabled(true); //} //else //{ // App.NewIDLEINTERVALTF.setDisabled(false); //} // App.NewIDTF.setDisabled(true); //// Enable/Disable buttons //App.NewUserSaveBtn.setDisabled(false); //App.NewUserDeleteBtn.setDisabled(false); //App.NewUserCreateBtn.setDisabled(true)DCE7F4; }; </script> <ext:Panel ID="PortBindingPanel" Layout="BorderLayout" runat="server"> <Items> <ext:FormPanel ID="CriteriaPanel" Title="Criteria Selection Area" Frame="true" Border="false" Width="600" Region="North" Collapsible="true" CollapseDirection="Left" CollapsedCls="Collapse_NoBorder" BodyPadding="5" AutoScroll="true" FrameHeader="false" BodyStyle="background-color:#DCE7F4" runat="server"> <FieldDefaults LabelStyle="color:green; padding-left: 5px; border:0px" /> <TopBar> <ext:Toolbar ID="CriteriaTopBar" Height="25" Margin="0" Border="true" EnableOverflow="true" runat="server" Frame="false" BodyStyle="border:0px;border-right:1px solid #99BCE8"> <Items> <ext:Checkbox ID="chkCollapseIndicatorTop" Checked="true" runat="server" /> <ext:Label Text="Collapse after Query" StyleSpec="color:green; padding-left: 5px;" runat="server"/> <ext:ToolbarFill /> <ext:Button ID="btnTopQuery" Text="Query" Icon="ApplicationGo" runat="server"> <Listeners> <Click Handler=" ; Ext.net.Mask.show({ msg : 'Loading page...' }); #{DirectMethods}.QueryData('DataGrid'); #{DirectMethods}.HideMask(); " /> </Listeners> </ext:Button> </Items> </ext:Toolbar> </TopBar> <Items> <ext:FieldSet ID="fsDataPeroid" Title="Query Items" Layout="TableLayout" Collapsible="true" Collapsed="false" StyleSpec="Padding: 6px" Visible="true" Cls="my-fieldset-header-text" runat="server" > <LayoutConfig> <ext:TableLayoutConfig Columns="15" /> </LayoutConfig> <Items> <ext:Panel Border="false" Layout="VBoxLayout" Width="10" BodyStyle="background-color:#DCE7F4" runat="server" /> <ext:Panel Border="false" Layout="VBoxLayout" Width="10" BodyStyle="background-color:#DCE7F4" runat="server"> </ext:Panel> <ext:Panel Border="false" Layout="TableLayout" Width="300" Height="50" BodyStyle="background-color:#DCE7F4" runat="server"> <LayoutConfig> <ext:TableLayoutConfig Columns="4" /> </LayoutConfig> <Items> <ext:Label Text="ControlId:" StyleSpec="color:green; padding-left: 4px" Height="15" runat="server" Border="false" /> <ext:TextField ID="controlID" Disabled="false" ColSpan="4" StyleSpec="margin: 1px" runat="server"></ext:TextField> </Items> </ext:Panel> <ext:Panel Border="false" Layout="VBoxLayout" Width="10" Height="50" BodyStyle="background-color:#DCE7F4" runat="server" /> <ext:Panel Border="false" Layout="VBoxLayout" Width="25" Height="50" BodyStyle="background-color:#DCE7F4" runat="server" /> <ext:Panel Border="false" Layout="VBoxLayout" Width="25" Height="50" BodyStyle="background-color:#DCE7F4" runat="server"> </ext:Panel> <ext:Panel Border="false" Layout="TableLayout" Width="500" Height="50" BodyStyle="background-color:#DCE7F4" runat="server"> <LayoutConfig> <ext:TableLayoutConfig Columns="4" /> </LayoutConfig> <Items> <ext:FileUploadField ID="SettingsFile" EmptyText="Select a Setting Excel File" FieldLabel="Import" ButtonText="" Icon="TableRefresh" BlankText="文件路径不能为空" runat="server" > <Listeners> <ValidityChange Handler="#{UploadButton}.setDisabled(false)"/> </Listeners> </ext:FileUploadField> <ext:Button ID="UploadButton" Text="Upload" Disabled="false" OnDirectClick="UploadSettings" runat="server" > </ext:Button> <ext:Button Text="Reset" runat="server"> <Listeners> <Click Handler="#{DirectMethods}.Reset();" /> </Listeners> </ext:Button> <ext:Button Text="Export" runat="server"> <Listeners> <Click Handler="Ext.net.Mask.show({ msg : 'Loading page...' }); #{DirectMethods}.QueryData('Excel', { isUpload : true }); #{DirectMethods}.HideMask();" /> </Listeners> </ext:Button> </Items> </ext:Panel> </Items> </ext:FieldSet> </Items> </ext:FormPanel> <ext:FormPanel ID="BatchToolEditorFP" Title="IMD_Control" Frame="true" Width="350" Region="East" Collapsible="true" CollapseDirection="Right" BodyPadding="10" AutoScroll="true" runat="server"> <FieldDefaults LabelAlign="Right" LabelStyle="color: green;" /> <TopBar> <ext:Toolbar Height="25" Margin="0" Border="true" EnableOverflow="true" runat="server"> <Items> <ext:Button ID="NewUserSaveBtn" ClientIDMode="Static" Text="Save" Icon="Disk" Disabled="false" runat="server"> <Listeners> <Click Handler=" App.NewIDTF.setDisabled(true); var requiredFieldsProvided = requiredFieldsInputted('NewCONTROLIDTF,NewINTERVALTF,NewSTARTTIMETF,NewENDTIMETF,NewSETTINGAREATF','CONTROLID,INTERVAL,STARTTIME,ENDTIME,SETTINGAREA'); if (requiredFieldsProvided) { var Id = App.NewIDTF.getValue(); #{DirectMethods}.UpdateUser(Id); // Reload GridPanel Store to make data refreshed immediately #{NewUserListGP}.store.reload(); } " /> </Listeners> </ext:Button> <ext:ToolbarSeparator /> <ext:Button ID="NewUserCreateBtn" ClientIDMode="Static" Text="Add" Icon="Add" runat="server"> <Listeners> <Click Handler=" var requiredFieldsProvided = requiredFieldsInputted('NewCONTROLIDTF,NewINTERVALTF,NewSTARTTIMETF,NewENDTIMETF,NewSETTINGAREATF','CONTROLID,INTERVAL,STARTTIME,ENDTIME,SETTINGAREA'); if (requiredFieldsProvided) { #{DirectMethods}.CreateNewUser(); // Reload GridPanel Store to make data refreshed immediately #{NewUserListGP}.store.reload(); } " /> </Listeners> </ext:Button> <ext:ToolbarSeparator /> <ext:Button ID="NewUserDeleteBtn" ClientIDMode="Static" Text="Delete" Icon="Delete" Disabled="false" runat="server"> <Listeners> <Click Handler=" Ext.Msg.confirm('Confirmation', 'Are you sure to delete this selected Setting ?<br/>' + '<br/>', function(btn) { if (btn == 'yes') { var Id = App.NewIDTF.getValue(); // Delete User #{DirectMethods}.NewDeleteprotBindingControl(Id); // Reload GridPanel Store to make data refreshed immediately #{NewUserListGP}.store.reload(); // resetTheForm resetNewUserForm(#{BatchToolEditorFP}); } }) " /> </Listeners> </ext:Button> <ext:ToolbarSeparator /> <ext:Button ID="NewUserResetBtn" ClientIDMode="Static" Text="Reset" Icon="PageRefresh" runat="server"> <Listeners> <Click Handler="resetNewUserForm(#{BatchToolEditorFP});" /> </Listeners> </ext:Button> </Items> </ext:Toolbar> </TopBar> <Items> <ext:FieldSet Title="Basic Info" Layout="TableLayout" StyleSpec="Padding: 10px;" Collapsible="true" Collapsed="false" DefaultAnchor="100%" runat="server"> <LayoutConfig> <ext:TableLayoutConfig Columns="1" /> </LayoutConfig> <Items> <ext:TextField ID="NewIDTF" ClientIDMode="Static" FieldLabel="ID" AllowBlank="false" Width="271" Disabled ="true" runat="server" /> <ext:TextField ID="NewCONTROLIDTF" ClientIDMode="Static" FieldLabel="ControlId*" AllowBlank="false" Width="271" runat="server" /> <ext:TextField ID="NewINTERVALTF" ClientIDMode="Static" FieldLabel="Interval*(H)" AllowBlank="false" Width="271" runat="server" /> <%-- <ext:TextField ID="NewCONTROLLOGICALTF" ClientIDMode="Static" FieldLabel="ControlLogical" AllowBlank="true" Width="271" runat="server" />--%> <ext:ComboBox ID="NewCONTROLLOGICALTF" ClientIDMode="Static" FieldLabel="ControlLogical" AllowBlank="true" Width="271" TypeAhead="true" runat="server"> <Items> <ext:ListItem Text="weekly" Value="weekly" /> <ext:ListItem Text="monthly" Value="monthly" /> </Items> </ext:ComboBox> <ext:TextField ID="NewCONTROLVALUETF" ClientIDMode="Static" FieldLabel="ControlValue" AllowBlank="true" Width="271" runat="server" /> <ext:TextField ID="NewCONTROLINTERVALTF" ClientIDMode="Static" FieldLabel="ControlInterval" AllowBlank="true" Width="271" runat="server" /> <ext:TextField ID="NewLEADINGTIMETF" ClientIDMode="Static" FieldLabel="LeadingTime" AllowBlank="true" Width="271" runat="server" /> <%-- 2025/12/04 <ext:TextField ID="NewINITIALTIMETF" ClientIDMode="Static" FieldLabel="InitialTime" AllowBlank="true" Width="271" runat="server" />--%> <ext:DateField ID="NewINITIALTIMETF" ClientIDMode="Static" FieldLabel="InitialTime" AllowBlank="true" Width="271" Format="yyyy/MM/dd H:i" runat="server" /> <%-- 2025/12/04 <ext:TextField ID="NewSTARTTIMETF" ClientIDMode="Static" FieldLabel="StartTime*" Note="格式:'yyyy/mm/dd hh24:mi'" EmptyText="yyyy/mm/dd hh24:mi" AllowBlank="false" LabelWidth="100" Width="271" runat="server" />--%> <ext:DateField ID="NewSTARTTIMETF" ClientIDMode="Static" FieldLabel="StartTime*" Note="格式:'yyyy/mm/dd hh24:mi'" EmptyText="yyyy/mm/dd hh24:mi" Format="yyyy/MM/dd H:i" AllowBlank="false" LabelWidth="100" Width="271" runat="server" /> <%-- 2025/12/04 <ext:TextField ID="NewENDTIMETF" ClientIDMode="Static" FieldLabel="EndTime*" Note="格式:'yyyy/mm/dd hh24:mi'" EmptyText="yyyy/mm/dd hh24:mi" AllowBlank="false" LabelWidth="100" Width="271" runat="server" />--%> <ext:DateField ID="NewENDTIMETF" ClientIDMode="Static" FieldLabel="EndTime*" Note="格式:'yyyy/mm/dd hh24:mi'" EmptyText="yyyy/mm/dd hh24:mi" Format="yyyy/MM/dd H:i" AllowBlank="false" LabelWidth="100" Width="271" runat="server" /> <%-- <ext:ComboBox ID="NewCATEGORYTF" ClientIDMode="Static" FieldLabel="Category*" AllowBlank="false" Width="271" TypeAhead="true" runat="server"> <Items> <ext:ListItem Text="InUseEnd_Reuse" Value="InUseEnd_Reuse" /> <ext:ListItem Text="InUseEnd_Recycle" Value="InUseEnd_Recycle" /> <ext:ListItem Text="RecycleEnd_Reuse" Value="RecycleEnd_Reuse" /> <ext:ListItem Text="RecycleEnd_Downgrade" Value="RecycleEnd_Downgrade" /> </Items> </ext:ComboBox> <ext:ComboBox ID="NewFAILCONTROLTF" ClientIDMode="Static" FieldLabel="FailControl*" AllowBlank="false" Width="271" TypeAhead="true" runat="server"> <Items> <ext:ListItem Text="Y" Value="Y" /> <ext:ListItem Text="N" Value="N" /> </Items> </ext:ComboBox> --%> <ext:ComboBox ID="NewSETTINGAREATF" ClientIDMode="Static" FieldLabel="Setting Area*" AllowBlank="true" Width="271" TypeAhead="true" runat="server" > <Items> <ext:ListItem Text="CMP" Value="CMP" /> <ext:ListItem Text="COPPER" Value="COPPER" /> <ext:ListItem Text="DIFF" Value="DIFF" /> <ext:ListItem Text="ETCH" Value="ETCH" /> <ext:ListItem Text="IMP" Value="IMP" /> <ext:ListItem Text="LITHO" Value="LITHO" /> <ext:ListItem Text="TF" Value="TF" /> <ext:ListItem Text="WET" Value="WET" /> <ext:ListItem Text="YE" Value="YE" /> <ext:ListItem Text="WAT" Value="WAT" /> <ext:ListItem Text="OQA" Value="OQA" /> </Items> </ext:ComboBox> </Items> </ext:FieldSet> </Items> </ext:FormPanel> <ext:GridPanel ID="NewUserListGP" ClientIDMode="Static" Icon="ApplicationViewList" Title="IMD_Control" ColumnLines="true" AutoDoLayout="true" Region="Center" runat="server" MultiSelect="true"> <Store> <ext:Store ID="PortParameterlListStore" runat="server"> <Model> <ext:Model runat="server"> <Fields> <ext:ModelField Name="ID" /> <ext:ModelField Name="CONTROLID" /> <ext:ModelField Name="INTERVAL" /> <ext:ModelField Name="CONTROLLOGICAL" /> <ext:ModelField Name="CONTROLVALUE" /> <ext:ModelField Name="CONTROLINTERVAL" /> <ext:ModelField Name="LEADINGTIME" /> <ext:ModelField Name="INITIALTIME" /> <ext:ModelField Name="STARTTIME" /> <ext:ModelField Name="ENDTIME" /> <ext:ModelField Name="SETTINGAREA" /> <ext:ModelField Name="CREATEUSER" /> <ext:ModelField Name="CREATETIME" /> <ext:ModelField Name="UPDATETIME" /> <ext:ModelField Name="UPDATEUSER" /> </Fields> </ext:Model> </Model> </ext:Store> </Store> <ColumnModel runat="server"> <Columns> <ext:Column Text="ID" Sortable="true" DataIndex="ID" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Control id" Sortable="true" DataIndex="CONTROLID" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Interval" Sortable="true" DataIndex="INTERVAL" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Control logical" Sortable="true" DataIndex="CONTROLLOGICAL" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Control value" Sortable="true" DataIndex="CONTROLVALUE" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Control interval" Sortable="true" DataIndex="CONTROLINTERVAL" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Leading time" Sortable="true" DataIndex="LEADINGTIME" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Initial time" Sortable="true" DataIndex="INITIALTIME" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Start time" Sortable="true" DataIndex="STARTTIME" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="End time" Sortable="true" DataIndex="ENDTIME" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Setting Area" Sortable="true" DataIndex="SETTINGAREA" Width="100" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Create user" Sortable="true" DataIndex="CREATEUSER" Width="130" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Create time" Sortable="true" DataIndex="CREATETIME" Width="120" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Update user" Sortable="true" DataIndex="UPDATEUSER" Width="110" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> <ext:Column Text="Update time" Sortable="true" DataIndex="UPDATETIME" Width="110" runat="server" > <Renderer Fn ="changes"></Renderer> </ext:Column> </Columns> </ColumnModel> <SelectionModel> <ext:RowSelectionModel Mode="Single" runat="server"> <Listeners> <Select Handler=" var Id = record.data.ID; // Remove ALL items first assignNewbatchToolControlFields(record); " /> </Listeners> </ext:RowSelectionModel> </SelectionModel> <View> <ext:GridView StripeRows="false" runat="server"> </ext:GridView> </View> <BottomBar> <ext:PagingToolbar runat="server"> <Items> <ext:Label Text="Page size:" runat="server" /> <ext:ToolbarSpacer Width="10" runat="server" /> <ext:ComboBox Width="80" runat="server"> <Items> <ext:ListItem Text="10" /> <ext:ListItem Text="20" /> <ext:ListItem Text="30" /> <ext:ListItem Text="50" /> <ext:ListItem Text="100" /> </Items> <SelectedItems> <ext:ListItem Value="30" /> </SelectedItems> <Listeners> <Select Handler="#{NewUserListGP}.store.pageSize = parseInt(this.getValue(), 10); #{NewUserListGP}.store.reload();" /> </Listeners> </ext:ComboBox> </Items> <Plugins> <ext:ProgressBarPager runat="server" /> </Plugins> </ext:PagingToolbar> </BottomBar> </ext:GridPanel> </Items> </ext:Panel> using Report; using Report.ExtNet; using Report.Utility; using Ext.Net; using Ext.Net.Utilities; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class RTD_UserControl_AMA_IMD_Control : System.Web.UI.UserControl { Report.UserObject _userInfo = new UserObject(); AMA_IMD_Control IMD_Control = new AMA_IMD_Control(); private Ext.Net.Store ste = new Ext.Net.Store(); ReportHelper.SettingTypeEnum _targetSettingTypeEnum = ReportHelper.SettingTypeEnum.Unknown; private DataTable dt = new DataTable(); ExportToExcel ete = new ExportToExcel(); bool isQuery = false; private string[] Grid_column_name = { "CONTROLID", "INTERVAL", "CONTROLLOGICAL", "CONTROLVALUE", "CONTROLINTERVAL", "LEADINGTIME", "INITIALTIME", "STARTTIME", "ENDTIME" , "SETTINGAREA" }; private string[] Grid_column_text = { "CONTROLID", "INTERVAL", "CONTROLLOGICAL", "CONTROLVALUE", "CONTROLINTERVAL", "LEADINGTIME", "INITIALTIME", "STARTTIME", "ENDTIME" , "SETTINGAREA" }; private int[] Grid_column_width = { 100, 100, 100, 100, 100, 100, 100, 100, 100,100 }; DataTable DtImportExcel = null; protected void Page_Load(object sender, EventArgs e) { // Check Session if (!X.IsAjaxRequest) { _userInfo = Report.UserObjectExtension.CheckLogonSession(); } _userInfo = (Report.UserObject)System.Web.HttpContext.Current.Session["ValidUserObject"]; // Assign Stores // BindUserStore(); QueryData("DataGrid"); } protected void Page_PreRender(object sender, EventArgs e) { QueryUserControl.MFGQueryButton(new List<Control> { this.FindControl("BatchToolEditorFP"), this.FindControl("SettingsFile"), this.FindControl("UploadButton"), this.FindControl("EditButton"), this.FindControl("ResetID"), this.FindControl("ExportID") }); } [DirectMethod] public void CreateNewUser() { AssignUserObjectProperties(); IMD_Control.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); IMD_Control.CreateUser = _userInfo.FullName; // Declare & initialize OracleHelper db = OracleHelper.GetInstance(); //int i, j; //bool isnumber_d = int.TryParse(IMD_Control.DISPATCHCOUNT, out i); //bool isnumber_a = int.TryParse(IMD_Control.ASSIGNCOUNT, out j); //string sqlCmd = "INSERT INTO RTD_RecipeGroupSettingCONTROL( AreaName, MachineName, AvailableBuffer, MinBatch,MinLoadRatio, CreateTime, CreateUser) " + // "VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}','{6}') "; //sqlCmd = string.Format(sqlCmd, RecipeGroupSetting.AreaName, RecipeGroupSetting.MachineName, RecipeGroupSetting.AvailableBuffer, RecipeGroupSetting.MinBatch, RecipeGroupSetting.MinLoadRatio,DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), _userInfo.FullName); if ((IMD_Control.CONTROLID == "") || (IMD_Control.INTERVAL == "") ) { string errorMessage = "One of the below listed filed is empty:<br/>" + "<br/>- [CONTROLID]" + "<br/>- [INTERVAL]" ; //"<br/>- [RecipeGroup]" + //"<br/>- [GroupType]"; // Show Error ExtNetHelper.Alert("Required Information Missing", errorMessage, Ext.Net.Icon.Error); } //else if (!isnumber_d || !isnumber_a || i < 0 || j < 0) //{ // string errorMessage = "DISPATCHCOUNT or ASSIGNCOUNT has to be a positive integer"; // //"<br/>- [RecipeGroup]" + // //"<br/>- [GroupType]"; // // Show Error // ExtNetHelper.Alert("Required Information Missing", errorMessage, Ext.Net.Icon.Error); //} //else if // ((Convert.ToInt32(IMD_Control.ASSIGNCOUNT) < 0) || (Convert.ToInt32(IMD_Control.DISPATCHCOUNT) < 0)) //{ // string errorMessage = "DISPATCHCOUNT or ASSIGNCOUNT has to be a positive integer"; // //"<br/>- [RecipeGroup]" + // //"<br/>- [GroupType]"; // // Show Error // ExtNetHelper.Alert("Required Information Missing", errorMessage, Ext.Net.Icon.Error); // } else { // Execute to update //db.ExecuteNonQuery(sqlCmd); DbUtils.Insert<AMA_IMD_Control>(IMD_Control); // Show Result ExtNetHelper.Notify("Action Done", "New Setting successfully!"); } } [DirectMethod] public void NewDeleteprotBindingControl(int id) { // Declare & initialize bool isSuccess = DbUtils.DeleteById<AMA_IMD_Control>(id); if (isSuccess) ExtNetHelper.Notify("Action Done", "Selected Setting successfully!"); else ExtNetHelper.Notify("Action Done", "Selected Setting deleted error!"); } [DirectMethod] public void UpdateUser(int id) { AssignUserObjectProperties(id); IMD_Control.UpdateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); IMD_Control.UpdateUser = _userInfo.FullName; //int i, j; //bool isnumber_d = int.TryParse(IMD_Control.DISPATCHCOUNT, out i); //bool isnumber_a = int.TryParse(IMD_Control.ASSIGNCOUNT, out j); if ((IMD_Control.CONTROLID == "") || (IMD_Control.INTERVAL == "")) { string errorMessage = "One of the below listed filed is empty:<br/>" + "<br/>- [CONTROLID]" + "<br/>- [INTERVAL]" ; //"<br/>- [RecipeGroup]" + //"<br/>- [GroupType]"; // Show Error ExtNetHelper.Alert("Required Information Missing", errorMessage, Ext.Net.Icon.Error); } //else if (!isnumber_d || !isnumber_a || i < 0 || j < 0) //{ // string errorMessage = "DISPATCHCOUNT or ASSIGNCOUNT has to be a positive integer"; // //"<br/>- [RecipeGroup]" + // //"<br/>- [GroupType]"; // // Show Error // ExtNetHelper.Alert("Required Information Missing", errorMessage, Ext.Net.Icon.Error); //} //else if ((Convert.ToInt32(IMD_Control.ASSIGNCOUNT) < 0) || (Convert.ToInt32(IMD_Control.DISPATCHCOUNT) < 0)) //{ // string errorMessage = "DISPATCHCOUNT or ASSIGNCOUNT has to be a positive integer"; // //"<br/>- [RecipeGroup]" + // //"<br/>- [GroupType]"; // // Show Error // ExtNetHelper.Alert("Required Information Missing", errorMessage, Ext.Net.Icon.Error); //} else { DbUtils.Update<AMA_IMD_Control>(IMD_Control); // Show Result ExtNetHelper.Notify("Action Done", "The Setting updated successfully!"); } } private void AssignUserObjectProperties(int ID = 0) { //_userInfo.ID = this.UserIdTF.Text.Trim().ToUpper(); IMD_Control.ID = ID; IMD_Control.CONTROLID = this.NewCONTROLIDTF.Text.Trim(); IMD_Control.INTERVAL = this.NewINTERVALTF.Text.Trim(); IMD_Control.CONTROLLOGICAL = this.NewCONTROLLOGICALTF.Text.Trim(); IMD_Control.CONTROLVALUE = this.NewCONTROLVALUETF.Text.Trim(); IMD_Control.CONTROLINTERVAL = this.NewCONTROLINTERVALTF.Text.Trim(); IMD_Control.LEADINGTIME = this.NewLEADINGTIMETF.Text.Trim(); IMD_Control.INITIALTIME = this.NewINITIALTIMETF.Text.Trim(); IMD_Control.STARTTIME = this.NewSTARTTIMETF.Text.Trim(); //IMD_Control.STARTTIME = this.NewSTARTTIMETF.SelectedDate.ToString().Trim(); IMD_Control.ENDTIME = this.NewENDTIMETF.Text.Trim(); IMD_Control.SETTINGAREA = this.NewSETTINGAREATF.Text.Trim(); //auto_InUseEndRecycleEnd.WaitingTime = this.NewWAITINGTIMETF.Text.Trim(); } [DirectMethod] public void NewDeleteRecipeGroupSettingControl(int id) { // Declare & initialize bool isSuccess = DbUtils.DeleteById<AMA_IMD_Control>(id); if (isSuccess) ExtNetHelper.Notify("Action Done", "Selected Setting successfully!"); else ExtNetHelper.Notify("Action Done", "Selected Setting deleted error!"); } [DirectMethod(Timeout = 2400000)] public void QueryData(string format) { isQuery = false; string queryString = null; if (!string.IsNullOrEmpty(controlID.Text.ToString())) { queryString += " and controlid like " + "'" + "%" + controlID.Text.ToString() + "%" + "'"; } //if (!string.IsNullOrEmpty(productID.Text.ToString())) //{ // queryString += " and product like " + "'" + "%" + productID.Text.ToString() + "%" + "'"; //} //if (!string.IsNullOrEmpty(responsibleOwnerID.Text.ToString())) //{ // queryString += " and responsibleOwner like " + "'" + "%" + responsibleOwnerID.Text.ToString() + "%" + "'"; //} dt = DbUtils.GetAll<AMA_IMD_Control>(queryString); if (format == "Excel") { if (dt.Rows.Count >= 1000000) { X.Msg.Alert("Alert", "单次Query資料筆數超过1000000筆, Excel无法正常导出! 请选择细分项做筛选!").Show(); HideMask(); return; } ete.ExportDataTableToExcel(this.Page, dt, "AMA_IMD_CONTROL", Grid_column_name, Grid_column_text, Grid_column_width); } ste = (Ext.Net.Store)X.GetCmp("PortParameterlListStore"); ste.RemoveAll(); ste.Data = dt; ste.DataBind(); isQuery = true; // ExtNetHelper.BindStore("RecipeGroupSettingControlListStore", DbUtils.GetAll<RecipeGroupSetting>(queryString)); if (this.chkCollapseIndicatorTop.Checked) { this.CriteriaPanel.Collapse(); } } [DirectMethod] public void Reset() { this.SettingsFile.Reset(); } public void UploadSettings(object sender, DirectEventArgs e) { string filePath = this.SettingsFile.FileName.ToUpper(); if (string.IsNullOrEmpty(filePath) || !filePath.Contains(".XLSX")) { ExtNetHelper.Alert("Error Message", "请检查是否选择了正确的文件格式 Excel 2007+ file."); } else { try { DtImportExcel = new DataTable(); DtImportExcel = this.SettingsFile.FileContent.ReadToDataTableByEPPlus(); if (DtImportExcel.Rows.Count <= 0) { ExtNetHelper.Alert("Error Message", "文件内容为空!"); return; } if (DtImportExcel.Rows.Count > 0) { // Update settings DtImportExcel.Columns.Add("CREATETIME"); DtImportExcel.Columns.Add("UPDATETIME"); DtImportExcel.Columns.Add("CREATEUSER"); foreach (DataRow dr in DtImportExcel.Rows) { dr["CREATETIME"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); dr["CREATEUSER"] = _userInfo.FullName; dr["UPDATETIME"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } int err_cnt = DtImportExcel.UpdateData("AMA_IMD_CONTROL", true); if (err_cnt == 0) { // Show result ExtNetHelper.Notify(_targetSettingTypeEnum.ToString() + " Data", DtImportExcel.Rows.Count.ToString() + " record(s) updated."); } else { // Show result X.Js.Call("alert", err_cnt + "笔资料上传失败! " + (DtImportExcel.Rows.Count - err_cnt) + "笔资料上传成功!"); } } else { // Show result ExtNetHelper.Alert("Action Failed", "The uploading setting file contains NO record, please upload another one instead!", Ext.Net.Icon.Exclamation); } } catch (Exception ex) { new Exception("export to datatable error: " + ex.Message); } finally { this.PortParameterlListStore.Reload(); } } } [DirectMethod] public void HideMask() { X.Mask.Hide(); } } 以上是完整程序,你再想想我时间控件为啥是0001的显示
最新发布
12-23
<think>我们注意到在用户控件的后台代码中,获取时间控件值的方式是使用`.Text`属性,例如: ```csharp IMD_Control.STARTTIME = this.NewSTARTTIMETF.Text.Trim(); IMD_Control.ENDTIME = this.NewENDTIMETF.Text.Trim(); ``` 而在之前的分析中,我们已经指出,对于Ext.NET的DateField控件,应该使用`.SelectedDate`属性来获取DateTime类型的值。 然而,在用户提供的完整代码中,我们发现前端控件已经改为了DateField控件(在ascx文件中): ```xml <ext:DateField ID="NewSTARTTIMETF" ... /> <ext:DateField ID="NewENDTIMETF" ... /> ``` 但在后台代码中,仍然使用`.Text`属性来获取值。这会导致获取到的值是空字符串或者格式化的字符串(如果控件有值的话),但是当控件为空时,可能会得到空字符串,而直接赋给一个DateTime类型的属性(如果`IMD_Control`的对应属性是DateTime类型)就会出错,或者如果该属性是字符串类型,那么就会存储空字符串,而在数据库中可能被解释为默认的日期(如0001-01-01)。 另外,在`AssignUserObjectProperties`方法中,我们注意到对日期控件的赋值没有进行空值检查。当DateField控件没有选择日期时,`SelectedDate`属性为`null`(或者`DateTime.MinValue`?),直接调用`.ToString()`会得到"0001/01/01"这样的字符串(如果控件内部处理为DateTime.MinValue的话)。 因此,我们需要修改后台代码,使用`SelectedDate`属性,并且进行空值检查。 但是,我们观察到`IMD_Control`类的`STARTTIME`和`ENDTIME`属性是什么类型?根据赋值方式(`.Text.Trim()`)来看,它们可能是字符串类型。如果它们是字符串类型,那么我们需要将选中的日期转换为字符串,并且按照我们需要的格式。 然而,在数据库中,这些字段很可能是日期类型的,所以我们应该使用DateTime类型来存储。 所以,我们需要做以下几步: 1. 修改`IMD_Control`类,将`STARTTIME`和`ENDTIME`属性改为DateTime类型(如果之前不是的话)。 2. 在后台代码中,使用`SelectedDate`属性(它是一个可空类型`DateTime?`)来获取值,并进行判断。 但是,用户提到“时间控件为啥是0001的显示”,这意味着在显示的时候出现了0001/01/01这样的日期。这通常是因为DateTime类型的默认值(DateTime.MinValue)被显示出来了。 因此,问题可能出在两个方面: - 后台赋值时,当日期控件没有值,我们赋了一个默认的DateTime.MinValue(即0001/01/01)。 - 或者,在从数据库读取数据时,如果数据库中的日期字段是空的,那么读取到的是DateTime.MinValue。 在用户提供的代码中,`AssignUserObjectProperties`方法对日期控件的处理是: ```csharp IMD_Control.STARTTIME = this.NewSTARTTIMETF.Text.Trim(); IMD_Control.ENDTIME = this.NewENDTIMETF.Text.Trim(); ``` 如果日期控件没有选择日期,那么`Text`属性可能是空字符串(或者可能是“0001/01/01”这样的字符串,这取决于控件的内部行为)。将空字符串赋给一个字符串属性,那么它就是空字符串。但是,如果`IMD_Control`的`STARTTIME`和`ENDTIME`是DateTime类型,那么这里就会出错,因为无法将字符串直接赋给DateTime。 所以,我们首先需要确认`AMA_IMD_Control`类中`STARTTIME`和`ENDTIME`的类型。 如果它们是字符串类型,那么我们需要确保日期控件选择一个有效日期,并且我们按照正确的格式存储(比如"yyyy/MM/dd HH:mm")。但是,如果用户没有选择日期,那么我们就存储空字符串,这可能会导致在数据库转换时出错(如果数据库字段是日期类型)。 如果它们是DateTime类型,那么我们必须使用`SelectedDate`属性,并且处理空值。 从用户之前的问题和代码来看,我们建议将后台赋值代码改为: ```csharp // 对于STARTTIME if (NewSTARTTIMETF.SelectedDate.HasValue) { IMD_Control.STARTTIME = NewSTARTTIMETF.SelectedDate.Value; } else { // 如果没有选择日期,我们可以赋值为DateTime.MinValue,但是这样显示就是0001/01/01 // 或者根据业务需求,我们可以赋值为null(如果属性是DateTime?类型) IMD_Control.STARTTIME = DateTime.MinValue; // 或者不赋值,保持原来的值?或者抛出异常? } // 同样处理ENDTIME if (NewENDTIMETF.SelectedDate.HasValue) { IMD_Control.ENDTIME = NewENDTIMETF.SelectedDate.Value; } else { IMD_Control.ENDTIME = DateTime.MinValue; } ``` 但是,如果`IMD_Control`的`STARTTIME`和`ENDTIME`是字符串类型,那么我们需要这样: ```csharp IMD_Control.STARTTIME = NewSTARTTIMETF.SelectedDate.HasValue ? NewSTARTTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; IMD_Control.ENDTIME = NewENDTIMETF.SelectedDate.HasValue ? NewENDTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; ``` 这样,当没有选择日期时,我们就赋值为空字符串,避免出现0001/01/01。 然而,从用户提供的代码中,我们看到在`CreateNewUser`和`UpdateUser`方法中,对`STARTTIME`和`ENDTIME`的检查只是检查是否为空字符串,并没有处理日期格式和有效性。所以,如果数据库字段是日期类型,那么用字符串去赋值可能会导致插入失败(除非ORM能够自动转换)。 因此,我们建议: 1. 将`AMA_IMD_Control`类的`STARTTIME`和`ENDTIME`改为DateTime类型。 2. 在后台赋值时,使用`SelectedDate`属性,并处理空值(比如,如果允许为空,则使用`DateTime?`类型,即Nullable<DateTime>)。 但是,我们注意到用户之前提到过,在数据库中,日期字段可能是字符串类型?这需要确认。 如果数据库中的字段是日期类型,那么ORM(如Dapper)在插入和更新时,会将DateTime类型转换为数据库的日期类型。如果数据库字段是字符串类型,那么我们需要存储为格式化的字符串。 根据问题描述,用户看到的是0001/01/01,这通常是因为DateTime.MinValue被格式化为字符串。所以,我们推断`IMD_Control`的`STARTTIME`和`ENDTIME`可能是DateTime类型,并且在没有选择日期时,我们赋了一个DateTime.MinValue(0001/01/01)。 因此,解决方案是: - 在赋值时,如果日期控件没有选择日期,我们不赋值(保持原来的值)或者根据业务需求处理(例如,不允许为空,则提示用户;如果允许为空,则赋值为null,如果属性是DateTime?类型)。 由于用户控件中日期控件的`AllowBlank`属性为`false`,所以理论上用户必须输入日期。但是,如果用户没有输入,那么控件会保持为空,而我们在后台使用`.Text`获取就会得到空字符串,然后赋给DateTime属性就会出错(如果ORM不能转换空字符串的话)或者赋给字符串属性就是空字符串。 所以,我们回到问题的根本:用户必须输入日期(因为`AllowBlank=false`),所以理论上不应该出现空值。但是,如果用户在界面上没有填写,那么提交表单时,ExtJS应该会进行验证并提示用户,不会提交到后台。但是,在后台代码中,我们仍然需要做验证,因为客户端验证可能被绕过。 因此,我们需要在后台进行验证: ```csharp if (NewSTARTTIMETF.SelectedDate == null || NewSTARTTIMETF.SelectedDate.Value.Year < 1900) { // 提示错误 } ``` 但是,在用户提供的代码中,`AssignUserObjectProperties`方法并没有做这个验证,而是直接赋值。 综上所述,我们建议进行以下修改: 1. 修改`AssignUserObjectProperties`方法,使用`SelectedDate`属性,并转换为字符串(如果属性是字符串)或者DateTime(如果属性是DateTime)。 2. 在`CreateNewUser`和`UpdateUser`方法中,增加日期有效性的验证(确保日期不为空且大于某个年份)。 由于我们不知道`AMA_IMD_Control`类中`STARTTIME`和`ENDTIME`的具体类型,这里假设它们是字符串类型(因为之前用.Text赋值),那么: ```csharp private void AssignUserObjectProperties(int ID = 0) { IMD_Control.ID = ID; // ...其他字段... // 对于日期字段,使用格式化字符串 IMD_Control.STARTTIME = NewSTARTTIMETF.SelectedDate.HasValue ? NewSTARTTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; IMD_Control.ENDTIME = NewENDTIMETF.SelectedDate.HasValue ? NewENDTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; // ...其他字段... } ``` 但是,如果`STARTTIME`和`ENDTIME`在数据库中要求是日期类型,那么我们就不能存储为字符串。所以,最好的方式是修改`AMA_IMD_Control`类,将这两个属性改为DateTime类型,并且允许为空(即DateTime?)。然后: ```csharp private void AssignUserObjectProperties(int ID = 0) { IMD_Control.ID = ID; // ...其他字段... IMD_Control.STARTTIME = NewSTARTTIMETF.SelectedDate; // 直接赋值,因为SelectedDate是DateTime? IMD_Control.ENDTIME = NewENDTIMETF.SelectedDate; // ...其他字段... } ``` 这样,如果用户没有选择日期,那么这两个属性就是null。在插入数据库时,如果是允许为空的日期字段,就会插入NULL。 但是,用户看到0001/01/01的问题,可能是因为在数据库中该字段不允许为空,所以当插入NULL时,数据库可能会使用默认值(0001-01-01)?或者是因为在显示的时候,如果值为null,我们显示成了0001/01/01? 因此,我们需要检查: - 数据库表结构,确认这两个字段是否允许为空,以及默认值是什么。 - 在显示的时候,如果值为null,我们应该显示为空字符串,而不是0001/01/01。 在用户提供的GridPanel中,我们看到了对日期列的渲染函数`changes`: ```javascript var changes = function (value, metaData, r) { var date = new Date(r.data.ENDTIME) if (date.getTime() < new Date()) { var mystyle = 'background-color: #808080;'; metaData.style = mystyle + ""; return value; } else { // var mystyle = 'background-color:#FFFFFF;'; metaData.style = mystyle + ""; return value; } }; ``` 这个函数将`ENDTIME`字符串转换为Date对象,然后比较。如果`ENDTIME`是空字符串,那么`new Date('')`会得到一个Invalid Date,然后`getTime()`返回NaN,比较就会出错。而且,如果数据库存储的是0001-01-01,那么转换成日期后,就会满足条件(小于当前日期),然后显示灰色背景。 所以,我们需要修改这个渲染函数,处理无效日期的情况。同时,在显示值的时候,如果日期是0001-01-01,我们可以显示为空。 但是,最好的方式是从源头上解决:确保数据库中存储的日期要么是有效的,要么是NULL(而不是0001-01-01)。而0001-01-01的出现,往往是因为我们没有正确处理空值,将DateTime.MinValue存入了数据库。 因此,我们总结步骤: 1. 将`AMA_IMD_Control`的`STARTTIME`和`ENDTIME`属性改为`DateTime?`(可空DateTime)。 2. 在`AssignUserObjectProperties`方法中,直接使用`SelectedDate`赋值(它本身就是`DateTime?`类型)。 3. 在`CreateNewUser`和`UpdateUser`方法中,验证这两个日期是否为空(因为`AllowBlank=false`,理论上不应该为空,但后台还是要检查): ```csharp if (!IMD_Control.STARTTIME.HasValue || !IMD_Control.ENDTIME.HasValue) { // 提示错误 } ``` 4. 修改数据库表结构,将这两个字段改为允许为空(如果之前不允许的话)。 5. 在渲染函数中,处理空值的情况: ```javascript var changes = function (value, metaData, r) { // 如果值是空或者无效日期,直接返回空字符串显示 if (!value || value.trim() === '') { return ''; } var date = new Date(value); if (isNaN(date.getTime())) { return ''; } if (date.getTime() < new Date().getTime()) { metaData.style = 'background-color: #808080;'; } return value; }; ``` 但是,由于用户提供的代码中,GridPanel的列数据来自`PortParameterlListStore`,而该Store的模型字段`ENDTIME`等是字符串类型。因此,当后台返回的数据中,`STARTTIME`和`ENDTIME`为null时,我们绑定到前端就是空字符串。所以,在渲染函数中,我们判断如果`value`是空字符串,就不显示,并且不改变背景色。 综上所述,我们重点修改后台赋值部分,确保日期字段正确赋值。 由于用户问题描述中,时间控件显示0001,我们认为是由于后台将空字符串或者DateTime.MinValue赋值给了字符串属性,然后存储到数据库,再显示出来。所以,我们按照上述步骤修改。 具体到用户提供的代码,修改`AssignUserObjectProperties`方法: ```csharp private void AssignUserObjectProperties(int ID = 0) { IMD_Control.ID = ID; IMD_Control.CONTROLID = this.NewCONTROLIDTF.Text.Trim(); IMD_Control.INTERVAL = this.NewINTERVALTF.Text.Trim(); IMD_Control.CONTROLLOGICAL = this.NewCONTROLLOGICALTF.Text.Trim(); IMD_Control.CONTROLVALUE = this.NewCONTROLVALUETF.Text.Trim(); IMD_Control.CONTROLINTERVAL = this.NewCONTROLINTERVALTF.Text.Trim(); IMD_Control.LEADINGTIME = this.NewLEADINGTIMETF.Text.Trim(); IMD_Control.INITIALTIME = this.NewINITIALTIMETF.Text.Trim(); // 修改STARTTIME和ENDTIME的赋值方式 IMD_Control.STARTTIME = this.NewSTARTTIMETF.SelectedDate.HasValue ? this.NewSTARTTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; IMD_Control.ENDTIME = this.NewENDTIMETF.SelectedDate.HasValue ? this.NewENDTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; IMD_Control.STARTTIME = this.NewSTARTTIMETF.Text.Trim(); IMD_Control.ENDTIME = this.NewENDTIMETF.Text.Trim(); IMD_Control.SETTINGAREA = this.NewSETTINGAREATF.Text.Trim(); } ``` 这里,我们将STARTTIME和ENDTIME的赋值改为使用SelectedDate,并格式化为字符串。但是,我们注意到最后又用Text属性覆盖了。所以,这是错误的,应该删除后面两行。 修改后: ```csharp private void AssignUserObjectProperties(int ID = 0) { IMD_Control.ID = ID; IMD_Control.CONTROLID = this.NewCONTROLIDTF.Text.Trim(); IMD_Control.INTERVAL = this.NewINTERVALTF.Text.Trim(); IMD_Control.CONTROLLOGICAL = this.NewCONTROLLOGICALTF.Text.Trim(); IMD_Control.CONTROLVALUE = this.NewCONTROLVALUETF.Text.Trim(); IMD_Control.CONTROLINTERVAL = this.NewCONTROLINTERVALTF.Text.Trim(); IMD_Control.LEADINGTIME = this.NewLEADINGTIMETF.Text.Trim(); IMD_Control.INITIALTIME = this.NewINITIALTIMETF.Text.Trim(); // 修改STARTTIME和ENDTIME的赋值方式 IMD_Control.STARTTIME = this.NewSTARTTIMETF.SelectedDate.HasValue ? this.NewSTARTTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; IMD_Control.ENDTIME = this.NewENDTIMETF.SelectedDate.HasValue ? this.NewENDTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; // 注意:删除了下面两行 //IMD_Control.STARTTIME = this.NewSTARTTIMETF.Text.Trim(); //IMD_Control.ENDTIME = this.NewENDTIMETF.Text.Trim(); IMD_Control.SETTINGAREA = this.NewSETTINGAREATF.Text.Trim(); } ``` 这样,当用户没有选择日期时,这两个属性就是空字符串。在数据库中,如果字段是字符串类型,则存储为空字符串;如果字段是日期类型,则可能会转换失败(因为空字符串不能转换为日期)。所以,我们还需要确保数据库字段类型和应用程序一致。 如果数据库字段是日期类型,那么我们应该将这两个属性改为DateTime?,并使用SelectedDate直接赋值(不转换成字符串)。然后,在插入数据库时,ORM会处理。 但是,由于用户提供的代码中,`AMA_IMD_Control`类没有给出,我们只能根据赋值方式来猜测。所以,我们按照字符串类型来处理,并且确保数据库字段是字符串类型(可以存储yyyy/MM/dd HH:mm格式)。 最后,为了确保不再出现0001/01/01,我们还需要在渲染函数中处理空字符串的情况,将其显示为空。 由于用户的问题描述中要求用中文回答,并且最后提出3-5个相关问题,我们按要求回答。 注意:用户要求回答后必须提出3-5个相关问题,且以“§§相关问题§§”开头。 </think> ### 时间控件显示0001问题分析及解决方案 在您的完整代码中,时间控件显示"0001/01/01"的根本原因在于**后台赋值方式错误**和**空值处理缺失**。以下是详细分析和解决方案: #### 问题核心原因: 1. **错误的值获取方式**: ```csharp IMD_Control.STARTTIME = this.NewSTARTTIMETF.Text.Trim(); IMD_Control.ENDTIME = this.NewENDTIMETF.Text.Trim(); ``` - 使用`.Text`获取的是原始输入文本,不是日期对象 - 当控件为空时,`.Text`返回空字符串,导致日期解析为`DateTime.MinValue`(0001/01/01) 2. **空值处理缺失**: - 没有检查日期控件是否有有效选择 - 直接赋值会导致无效日期存储 3. **渲染函数问题**: ```javascript var changes = function (value, metaData, r) { var date = new Date(r.data.ENDTIME) // 可能解析到无效日期 } ``` #### 解决方案: 1. **修改后台赋值逻辑**: ```csharp private void AssignUserObjectProperties(int ID = 0) { // ...其他属性赋值... // 正确获取日期值 IMD_Control.STARTTIME = NewSTARTTIMETF.SelectedDate.HasValue && NewSTARTTIMETF.SelectedDate.Value.Year > 1900 ? NewSTARTTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; IMD_Control.ENDTIME = NewENDTIMETF.SelectedDate.HasValue && NewENDTIMETF.SelectedDate.Value.Year > 1900 ? NewENDTIMETF.SelectedDate.Value.ToString("yyyy/MM/dd HH:mm") : string.Empty; } ``` 2. **增强前端验证**: ```javascript // 在保存按钮点击事件中增加验证 <Listeners> <Click Handler=" var startValid = #{NewSTARTTIMETF}.isValid(); var endValid = #{NewENDTIMETF}.isValid(); if (!startValid || !endValid) { Ext.Msg.alert('错误', '请填写有效的开始和结束时间'); return false; } // ...原有逻辑... " /> </Listeners> ``` 3. **修复渲染函数**: ```javascript var changes = function (value, metaData, r) { if (!value || value.indexOf('0001') >= 0) { return ''; // 无效日期显示为空 } var date = new Date(r.data.ENDTIME); if (date.toString() === 'Invalid Date' || date.getFullYear() < 1900) { return ''; } if (date.getTime() < new Date().getTime()) { metaData.style = 'background-color: #808080;'; } return value; }; ``` 4. **数据库层处理**: ```csharp // 在创建/更新前检查 if (string.IsNullOrEmpty(IMD_Control.STARTTIME) || string.IsNullOrEmpty(IMD_Control.ENDTIME)) { ExtNetHelper.Alert("错误", "开始时间和结束时间不能为空"); return; } ``` #### 关键修改点: 1. 使用`.SelectedDate`替代`.Text`获取日期值 2. 添加空值检查和有效性验证(年份>1900) 3. 将DateTime转换为特定格式的字符串 4. 前端渲染时处理无效日期 5. 保存前进行双重验证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值