[控件]unigui移动端下Unidatepicker时间显示解决方案

http://tz10000.com/kong-jian-unigui-yi-dong-duan-xia-unidatepicker-shi-jian-xian-shi-jie-jue-fang-an.html

2017-03-07 • Delphi • 评论关闭 • Aar0n

unigui搞移动端,需求上需要采用日期,但是默认是不支持时间选择的,怎么办?

只能改造了@~@。

1.下载以下JS文件放到程序files目录下。

https://raw.githubusercontent.com/tomalex0/senchatouch-datetimepickerv2/master/ux/DateTime.js
https://raw.githubusercontent.com/tomalex0/senchatouch-datetimepickerv2/master/ux/DateTimePicker.js

2.在CustomFiles项目加入如下内容。

files/DateTime.js
files/DateTimePicker.js

3.调整时间格式,如下。

UnimDatePicker1.DateFormat := "dd/MM/yyyy H:i"

4.对控件添加以下事件。

1. UnimDatePicker1 -> ClientEvents -> UniEvents .. beforeInit fn:

function beforeInit(sender, config)
{
    config.picker = Ext.create('Ext.ux.picker.DateTime', {
                    useTitles: false,
                    doneButton: true,
                    cancelButton: true,
                    minuteInterval : 1,
                    //slotOrder: ['month', 'day', 'year','hour','minute'],
                    toolbar: {
                      //items : datetimepickettoolbaritems
                    }                        
                  });
    Ext.Date.patterns={CustomFormat: "d/m/Y H:i"}; // <------------
}

2. UnimDatePicker1 -> ClientEvents -> ExtEvents -> function change:

function change(sender, newDate, oldDate, eOpts)
{
    ajaxRequest(sender, '_dateChange', ['val='+Ext.Date.format(newDate, Ext.Date.patterns.CustomFormat)])
}

3. UnimDatePicker1 -> OnAjaxEvent:

procedure TMainmForm.UnimDatePicker1AjaxEvent(Sender: TComponent;
  EventName: string; Params: TUniStrings);
var
  newDateTime : TDateTime;
  Fmt: TFormatSettings;
begin
  if EventName = '_dateChange' then
  begin
    Fmt.ShortDateFormat:='dd/mm/yyyy';
    Fmt.DateSeparator  :='/';
    Fmt.LongTimeFormat :='hh:mm';
    Fmt.TimeSeparator  :=':';
   
    newDateTime := StrToDateTime(Params.Values['val'], Fmt);
    //ShowMessage(DateTimeToStr(newDateTime));
  end; end;
https://raw.githubusercontent.com/tomalex0/senchatouch-datetimepickerv2/master/ux/DateTime.js

Ext.define('Ext.ux.picker.DateTime', {
extend: 'Ext.picker.Picker',
xtype: 'datetimepicker',
alternateClassName: 'Ext.ux.DateTimePicker',
requires: ['Ext.DateExtras'], config: {
/**
* @cfg {Number} yearFrom
* The start year for the date picker.
* @accessor
*/
yearFrom: 1980, /**
* @cfg {Number} yearTo
* The last year for the date picker.
* @default the current year (new Date().getFullYear())
* @accessor
*/
yearTo: new Date().getFullYear(), /**
* @cfg {String} monthText
* The label to show for the month column.
* @accessor
*/
monthText: (Ext.os.deviceType.toLowerCase() == "phone") ? 'M' : 'Month', /**
* @cfg {String} dayText
* The label to show for the day column.
* @accessor
*/
dayText: (Ext.os.deviceType.toLowerCase() == "phone") ? 'j' : 'Day', /**
* @cfg {String} yearText
* The label to show for the year column.
* @accessor
*/
yearText: (Ext.os.deviceType.toLowerCase() == "phone") ? 'Y' : 'Year', /**
* @cfg {String} hourText
* The label to show for the hour column. Defaults to 'Hour'.
*/
hourText: (Ext.os.deviceType.toLowerCase() == "phone") ? 'H' : 'Hour', /**
* @cfg {String} minuteText
* The label to show for the minute column. Defaults to 'Minute'.
*/
minuteText: (Ext.os.deviceType.toLowerCase() == "phone") ? 'i' : 'Minute', /**
* @cfg {String} ampmText
* The label to show for the ampm column. Defaults to 'AM/PM'.
*/
ampmText: (Ext.os.deviceType.toLowerCase() == "phone") ? 'A' : 'AM/PM', /**
* @cfg {Array} slotOrder
* An array of strings that specifies the order of the slots.
* @accessor
*/
slotOrder: ['month', 'day', 'year','hour','minute','ampm'], /**
* @cfg {Int} minuteInterval
* @accessor
*/
minuteInterval : 15, /**
* @cfg {Boolean} ampm
* @accessor
*/
ampm : false, /**
* @cfg {Boolean} displayUTC
* If set to true, displays UTC time in the DatePicker
* @accessor
*/
displayUTC: false
}, initialize: function() {
this.callParent(); this.on({
scope: this,
delegate: '> slot',
slotpick: this.onSlotPick
});
}, setValue: function(value, animated) {
if (Ext.isDate(value)) { // See if we should display in UTC
if (this.getDisplayUTC()) {
ampm = 'AM';
currentHours = hour = value.getUTCHours();
if(this.getAmpm()){
if (currentHours > 12) {
ampm = "PM";
hour -= 12;
} else if(currentHours == 12) {
ampm = "PM";
} else if(currentHours == 0) {
hour = 12;
}
}
value = {
day : value.getUTCDate(),
month: value.getUTCMonth() + 1,
year : value.getUTCFullYear(),
hour : hour,
minute : value.getUTCMinutes(),
ampm : ampm
};
// Display in local timezone
} else {
ampm = 'AM';
currentHours = hour = value.getHours();
if(this.getAmpm()){
if (currentHours > 12) {
ampm = "PM";
hour -= 12;
} else if(currentHours == 12) {
ampm = "PM";
} else if(currentHours == 0) {
hour = 12;
}
}
value = {
day : value.getDate(),
month: value.getMonth() + 1,
year : value.getFullYear(),
hour : hour,
minute : value.getMinutes(),
ampm : ampm
};
}
} this.callParent([value, animated]);
}, getValue: function() {
var values = {},
daysInMonth, day, hour, minute,
items = this.getItems().items,
ln = items.length,
item, i; for (i = 0; i < ln; i++) {
item = items[i];
if (item instanceof Ext.picker.Slot) {
values[item.getName()] = item.getValue(true);
}
}
daysInMonth = this.getDaysInMonth(values.month, values.year);
day = Math.min(values.day, daysInMonth),hour = values.hour, minute = values.minute; var yearval = (isNaN(values.year)) ? new Date().getFullYear() : values.year,
monthval = (isNaN(values.month)) ? (new Date().getMonth()) : (values.month - 1),
dayval = (isNaN(day)) ? (new Date().getDate()) : day,
hourval = (isNaN(hour)) ? new Date().getHours() : hour,
minuteval = (isNaN(minute)) ? new Date().getMinutes() : minute;
if(values.ampm && values.ampm == "PM" && hourval<12){
hourval = hourval + 12;
}
if(values.ampm && values.ampm == "AM" && hourval == 12){
hourval = 0;
} // Return the proper values based upon UTC
if (this.getDisplayUTC()) {
return new Date(Date.UTC(yearval, monthval, dayval, hourval, minuteval));
} else {
return new Date(yearval, monthval, dayval, hourval, minuteval);
}
}, /**
* Updates the yearFrom configuration
*/
updateYearFrom: function() {
if (this.initialized) {
this.createSlots();
}
}, /**
* Updates the yearTo configuration
*/
updateYearTo: function() {
if (this.initialized) {
this.createSlots();
}
}, /**
* Updates the monthText configuration
*/
updateMonthText: function(newMonthText, oldMonthText) {
var innerItems = this.getInnerItems,
ln = innerItems.length,
item, i; //loop through each of the current items and set the title on the correct slice
if (this.initialized) {
for (i = 0; i < ln; i++) {
item = innerItems[i]; if ((typeof item.title == "string" && item.title == oldMonthText) || (item.title.html == oldMonthText)) {
item.setTitle(newMonthText);
}
}
}
}, /**
* Updates the dayText configuraton
*/
updateDayText: function(newDayText, oldDayText) {
var innerItems = this.getInnerItems,
ln = innerItems.length,
item, i; //loop through each of the current items and set the title on the correct slice
if (this.initialized) {
for (i = 0; i < ln; i++) {
item = innerItems[i]; if ((typeof item.title == "string" && item.title == oldDayText) || (item.title.html == oldDayText)) {
item.setTitle(newDayText);
}
}
}
}, /**
* Updates the yearText configuration
*/
updateYearText: function(yearText) {
var innerItems = this.getInnerItems,
ln = innerItems.length,
item, i; //loop through each of the current items and set the title on the correct slice
if (this.initialized) {
for (i = 0; i < ln; i++) {
item = innerItems[i]; if (item.title == this.yearText) {
item.setTitle(yearText);
}
}
}
}, // @private
constructor: function() {
this.callParent(arguments);
this.createSlots();
}, /**
* Generates all slots for all years specified by this component, and then sets them on the component
* @private
*/
createSlots: function() {
var me = this,
slotOrder = this.getSlotOrder(),
yearsFrom = me.getYearFrom(),
yearsTo = me.getYearTo(),
years = [],
days = [],
months = [],
hours = [],
minutes = [],
ampm= [],
ln, tmp, i,
daysInMonth; if(!this.getAmpm()){
var index = slotOrder.indexOf('ampm');
if(index >= 0){
slotOrder.splice(index);
}
}
// swap values if user mixes them up.
if (yearsFrom > yearsTo) {
tmp = yearsFrom;
yearsFrom = yearsTo;
yearsTo = tmp;
} for (i = yearsFrom; i <= yearsTo; i++) {
years.push({
text: i,
value: i
});
} daysInMonth = this.getDaysInMonth(1, new Date().getFullYear()); for (i = 0; i < daysInMonth; i++) {
days.push({
text: i + 1,
value: i + 1
});
} for (i = 0, ln = Ext.Date.monthNames.length; i < ln; i++) {
months.push({
text: (Ext.os.deviceType.toLowerCase() == "phone") ? Ext.Date.monthNames[i].substring(0,3) : Ext.Date.monthNames[i],
value: i + 1
});
} var hourLimit = (this.getAmpm()) ? 12 : 23;
var hourStart = (this.getAmpm()) ? 1 : 0;
for(i=hourStart;i<=hourLimit;i++){
hours.push({
text: this.pad2(i),
value: i
});
} for(i=0;i<60;i+=this.getMinuteInterval()){
minutes.push({
text: this.pad2(i),
value: i
});
} ampm.push({
text: 'AM',
value: 'AM'
},{
text: 'PM',
value: 'PM'
}); var slots = []; slotOrder.forEach(function(item) {
slots.push(this.createSlot(item, days, months, years,hours,minutes,ampm));
}, this); me.setSlots(slots);
}, /**
* Returns a slot config for a specified date.
* @private
*/
createSlot: function(name, days, months, years,hours,minutes,ampm) {
var isPhone = (Ext.os.deviceType.toLowerCase() == "phone"),
align = (isPhone) ? 'left' : 'center'; switch (name) {
case 'year':
return {
name: 'year',
align: align,
data: years,
title: this.getYearText(),
flex: isPhone ? 1.3 : 3
};
case 'month':
return {
name: name,
align: isPhone ? 'left' : 'right',
data: months,
title: this.getMonthText(),
flex: isPhone ? 1.2 : 4
};
case 'day':
return {
name: 'day',
align: align,
data: days,
title: this.getDayText(),
flex: isPhone ? 0.9 : 2
};
case 'hour':
return {
name: 'hour',
align: align,
data: hours,
title: this.getHourText(),
flex: isPhone ? 0.9 : 2
};
case 'minute':
return {
name: 'minute',
align: align,
data: minutes,
title: this.getMinuteText(),
flex: isPhone ? 0.9 : 2
};
case 'ampm':
return {
name: 'ampm',
align: align,
data: ampm,
title: this.getAmpmText(),
flex: isPhone ? 1.1 : 2
};
}
}, onSlotPick: function(pickedSlot, oldValue, htmlNode, eOpts) { // We don't actually get passed the new value. I think this is an ST2 bug. Instead we get passed the slot,
// the oldValue, the node in the slot which was moved to, and options for the event.
//
// However looking at the code that fires the slotpick event, the slot.selectedIndex is always set there
// We can therefore use this to pull the underlying value that was picked out of the slot's store
var pickedValue = pickedSlot.getStore().getAt(pickedSlot.selectedIndex).get(pickedSlot.getValueField()); pickedSlot.setValue(pickedValue); if(pickedSlot.getName() === 'month' || pickedSlot.getName() === 'year') {
this.repopulateDaySlot();
}
}, repopulateDaySlot: function() {
var slot = this.getDaySlot(),
days = [],
month = this.getSlotByName('month').getValue(),
year = this.getSlotByName('year').getValue(),
daysInMonth; // Get the new days of the month for this new date
daysInMonth = this.getDaysInMonth(month, year); for (var i = 0; i < daysInMonth; i++) {
days.push({
text: i + 1,
value: i + 1
});
} // We dont need to update the slot days unless it has changed
if (slot.getData().length == days.length) {
return;
} slot.setData(days);
}, getSlotByName: function(name) {
return this.down('pickerslot[name=' + name + ']');
}, getDaySlot: function() {
return this.getSlotByName('day');
}, // @private
getDaysInMonth: function(month, year) {
var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
return month == 2 && this.isLeapYear(year) ? 29 : daysInMonth[month-1];
}, // @private
isLeapYear: function(year) {
return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)));
},
pad2 : function(number) {
return (number < 10 ? '0' : '') + number ;
}
});
https://raw.githubusercontent.com/tomalex0/senchatouch-datetimepickerv2/master/ux/DateTimePicker.js
/**
* @aside guide forms
*
* This is a specialized field which shows a {@link Ext.ux.picker.DateTime} when tapped. If it has a predefined value,
* or a value is selected in the {@link Ext.ux.picker.DateTime}, it will be displayed like a normal {@link Ext.field.Text}
* (but not selectable/changable).
*
* Ext.create('Ext.ux.field.DateTimePicker', {
* label: 'Birthday',
* value: new Date()
* });
*
* {@link Ext.ux.field.DateTimePicker} fields are very simple to implement, and have no required configurations.
*
* ## Examples
*
* It can be very useful to set a default {@link #value} configuration on {@link Ext.ux.field.DateTimePicker} fields. In
* this example, we set the {@link #value} to be the current date. You can also use the {@link #setValue} method to
* update the value at any time.
*
* @example miniphone preview
* Ext.create('Ext.form.Panel', {
* fullscreen: true,
* items: [
* {
* xtype: 'fieldset',
* items: [
* {
* xtype: 'datetimepickerfield',
* label: 'Birthday',
* name: 'birthday',
* value: new Date()
* }
* ]
* },
* {
* xtype: 'toolbar',
* docked: 'bottom',
* items: [
* { xtype: 'spacer' },
* {
* text: 'setValue',
* handler: function() {
* var datetimepickerfield = Ext.ComponentQuery.query('datetimepickerfield')[0];
*
* var randomNumber = function(from, to) {
* return Math.floor(Math.random() * (to - from + 1) + from);
* };
*
* datetimepickerfield.setValue({
* month: randomNumber(0, 11),
* day : randomNumber(0, 28),
* year : randomNumber(1980, 2011)
* });
* }
* },
* { xtype: 'spacer' }
* ]
* }
* ]
* });
*
* When you need to retrieve the date from the {@link Ext.ux.field.DateTimePicker}, you can either use the {@link #getValue} or
* {@link #getFormattedValue} methods:
*
* @example preview
* Ext.create('Ext.form.Panel', {
* fullscreen: true,
* items: [
* {
* xtype: 'fieldset',
* items: [
* {
* xtype: 'datetimepickerfield',
* label: 'Birthday',
* name: 'birthday',
* value: new Date()
* }
* ]
* },
* {
* xtype: 'toolbar',
* docked: 'bottom',
* items: [
* {
* text: 'getValue',
* handler: function() {
* var datetimepickerfield = Ext.ComponentQuery.query('datetimepickerfield')[0];
* Ext.Msg.alert(null, datetimepickerfield.getValue());
* }
* },
* { xtype: 'spacer' },
* {
* text: 'getFormattedValue',
* handler: function() {
* var datetimepickerfield = Ext.ComponentQuery.query('datetimepickerfield')[0];
* Ext.Msg.alert(null, datetimepickerfield.getFormattedValue());
* }
* }
* ]
* }
* ]
* });
*
*
*/ Ext.define('Ext.ux.field.DateTimePicker', {
extend: 'Ext.field.Text',
alternateClassName: 'Ext.form.DateTimePicker',
xtype: 'datetimepickerfield',
requires: [
'Ext.ux.picker.DateTime',
'Ext.DateExtras'
], /**
* @event change
* Fires when a date is selected
* @param {Ext.ux.field.DateTimePicker} this
* @param {Date} date The new date
*/ config: {
ui: 'select', /**
* @cfg {Object/Ext.ux.picker.DateTime} picker
* An object that is used when creating the internal {@link Ext.ux.picker.DateTime} component or a direct instance of {@link Ext.ux.picker.DateTime}
* Defaults to true
* @accessor
*/
picker: true, /**
* @cfg {Boolean}
* @hide
* @accessor
*/
clearIcon: false, /**
* @cfg {Object/Date} value
* Default value for the field and the internal {@link Ext.ux.picker.DateTime} component. Accepts an object of 'year',
* 'month' and 'day' values, all of which should be numbers, or a {@link Date}.
*
* Example: {year: 1989, day: 1, month: 5} = 1st May 1989 or new Date()
* @accessor
*/ /**
* @cfg {Boolean} destroyPickerOnHide
* Whether or not to destroy the picker widget on hide. This save memory if it's not used frequently,
* but increase delay time on the next show due to re-instantiation. Defaults to false
* @accessor
*/
destroyPickerOnHide: false, /**
* @cfg {String} dateTimeFormat The format to be used when displaying the date in this field.
* Accepts any valid datetime format. You can view formats over in the {@link Ext.Date} documentation.
* Defaults to `Ext.util.Format.defaultDateFormat`.
*/
dateTimeFormat: 'm/d/Y h:i:A',
/**
* @cfg {Object}
* @hide
*/
component: {
useMask: true
}
}, initialize: function() {
this.callParent(); this.getComponent().on({
scope: this, masktap: 'onMaskTap'
}); this.getComponent().input.dom.disabled = true;
}, syncEmptyCls: Ext.emptyFn, applyValue: function(value) {
if (!Ext.isDate(value) && !Ext.isObject(value)) {
value = null;
} if (Ext.isObject(value)) {
value = new Date(value.year, value.month - 1, value.day,value.hour,value.minute);
} return value;
}, updateValue: function(newValue) {
var picker = this._picker;
if (picker && picker.isPicker) {
picker.setValue(newValue);
} // Ext.Date.format expects a Date
if (newValue !== null) {
this.getComponent().setValue(Ext.Date.format(newValue, this.getDateTimeFormat() || Ext.util.Format.defaultDateFormat));
} else {
this.getComponent().setValue('');
} if (this._picker && this._picker instanceof Ext.ux.picker.DateTime) {
this._picker.setValue(newValue);
}
}, /**
* Updates the date format in the field.
* @private
*/
updateDateFormat: function(newDateFormat, oldDateFormat) {
var value = this.getValue();
if (newDateFormat != oldDateFormat && Ext.isDate(value) && this._picker && this._picker instanceof Ext.ux.picker.DateTime) {
this.getComponent().setValue(Ext.Date.format(value, newDateFormat || Ext.util.Format.defaultDateFormat));
}
}, /**
* Returns the {@link Date} value of this field.
* If you wanted a formated date
* @return {Date} The date selected
*/
getValue: function() {
if (this._picker && this._picker instanceof Ext.ux.picker.DateTime) {
return this._picker.getValue();
} return this._value;
}, /**
* Returns the value of the field formatted using the specified format. If it is not specified, it will default to
* {@link #dateFormat} and then {@link Ext.util.Format#defaultDateFormat}.
* @param {String} format The format to be returned
* @return {String} The formatted date
*/
getFormattedValue: function(format) {
var value = this.getValue();
console.log(this.getDateTimeFormat(),"format");
return (Ext.isDate(value)) ? Ext.Date.format(value, format || this.getDateTimeFormat() || Ext.util.Format.defaultDateFormat) : value;
}, applyPicker: function(picker, pickerInstance) {
if (pickerInstance && pickerInstance.isPicker) {
picker = pickerInstance.setConfig(picker);
} return picker;
}, getPicker: function() {
var picker = this._picker,
value = this.getValue(); if (picker && !picker.isPicker) {
picker = Ext.factory(picker, Ext.ux.picker.DateTime);
picker.on({
scope: this,
cancel: 'onPickerCancel',
change: 'onPickerChange',
hide : 'onPickerHide'
}); if (value !== null) {
picker.setValue(value);
} Ext.Viewport.add(picker);
this._picker = picker;
} return picker;
}, /**
* @private
* Listener to the tap event of the mask element. Shows the internal DatePicker component when the button has been tapped.
*/
onMaskTap: function(e) {
if (this.getDisabled()) {
return false;
} if (this.getReadOnly()) {
return false;
} // Make sure to fire the focus event
this.fireEvent('focus', this, e); this.getPicker().show(); return false;
}, /**
* @private
* Revert internal date so field won't appear changed
*/
onPickerCancel: function(picker, options) {
if (this.getDestroyPickerOnHide() && picker) {
this._picker = this._picker.config;
picker.destroy();
}
return true;
}, /**
* Called when the picker changes its value
* @param {Ext.ux.picker.DateTime} picker The date picker
* @param {Object} value The new value from the date picker
* @private
*/
onPickerChange: function(picker, value) {
var me = this; me.setValue(value);
me.fireEvent('change', me, me.getValue());
}, /**
* Destroys the picker when it is hidden, if
* {@link Ext.ux.field.DateTimePicker#destroyPickerOnHide destroyPickerOnHide} is set to true
* @private
*/
onPickerHide: function() {
var picker = this.getPicker();
if (this.getDestroyPickerOnHide() && picker) {
picker.destroy();
this._picker = true;
}
}, reset: function() {
this.setValue(this.originalValue);
}, // @private
destroy: function() {
var picker = this.getPicker(); if (picker && picker.isPicker) {
picker.destroy();
} this.callParent(arguments);
}
//<deprecated product=touch since=2.0>
}, function() {
this.override({
getValue: function(format) {
if (format) {
//<debug warn>
Ext.Logger.deprecate("format argument of the getValue method is deprecated, please use getFormattedValue instead", this);
//</debug>
return this.getFormattedValue(format);
}
return this.callOverridden();
}
}); /**
* @method getDatePicker
* @inheritdoc Ext.ux.field.DateTimePicker#getPicker
* @deprecated 2.0.0 Please use #getPicker instead
*/
Ext.deprecateMethod(this, 'getDatePicker', 'getPicker');
//</deprecated>
});

[控件]unigui移动端下Unidatepicker时间显示解决方案的更多相关文章

  1. 关于Devexpress15.2中GridControl控件选择字段ColumnEdit下拉时间设置

    效果:点击表格GridControl控件中的列,可以显示日期和时间.时间可以手动修改.(绑定日期格式的字段) 设置步骤:1.点击时间字段列表设置ColumnEdit-New-选择DateEdit出现r ...

  2. atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系

    atitit.组件化事件化的编程模型--服务端控件(1)---------服务端控件与标签的关系 1. 服务器控件是可被服务器理解的标签.有三种类型的服务器控件: 1 1.1. HTML 服务器控件  ...

  3. #include <objsafe.h>//OCX控件在IE8浏览器下不能使用问题

    一.OCX控件开发常见的问题 1.OCX控件在IE8浏览器下不能使用问题 原因:IE8会拦截OCX控件的方法. 解决方法:在OCX控件开发时加入安全接口. (1)在有"Crtl"字 ...

  4. WPF 控件被禁用,悬浮提示不显示问题

    原文:WPF 控件被禁用,悬浮提示不显示问题 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/89 ...

  5. VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。

    原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...

  6. GridControl控件绑定RepositoryItemImageComboBox 作为下拉框使用

    如果,时间长时了,已前做过的东西,都记不得了,所以记录一下. 废话不多说. 1.拖出gridview控件,然后将字段绑定上去 2.将要做下拉框的控件加入RepositoryItemImageCombo ...

  7. Android 布局控件——滚动条视图,日期,时间

    今天学长讲了一些控件,比较强的那种控件. 刚开始讲了图片,但是图片我前面写过了就跳过. 滚动条牛牛们应该很熟悉,也常用哈. 这是垂直的滚动条视图哈 一起来用吧! <ScrollView andr ...

  8. 第一个开源控件:Google 官方下拉刷新控件 SwipeRefreshLayout 强化版,支持上拉刷新

    最近比较闲,所以趁着这时间撸了个SwipeRefreshLayout的加强版,Github地址. 原版只支持下拉刷新,强化之后支持上拉刷新和一进入页面就加载刷新,整个控件的加载动画是一致的,毫无违和感 ...

  9. 9.2.2 .net framework下的MVC 控件的封装(下)

    控件封装的部分说明 可能有人觉得应该前后端分离,我也承认这是应该的方向,我们也在考虑使用ng2等简化前端.但是,我们封装控件还是因为如下原因综合考虑的: 我们这是个框架,上面支撑了许多个应用,包含几百 ...

随机推荐

  1. BZOJ 2594 水管局长 - LCT 维护链信息

    Solution 由于链信息不好直接维护, 所以新建一个节点存储边的权值, 并把这个节点连向 它所连的节点 $u$, $v$ $pushup$中更新维护的 $mx$ 指向路径上权值最大的边的编号. 由 ...

  2. echart 3 数据密集时,断点不显示问题

    如上图最开始标识的两点是不显示的,配置处理代码如下(series中配置symbolSize: 1,showAllSymbol: true): myChart.showLoading(); $.get( ...

  3. 利用PHP脚本辅助MySQL数据库管理3-删除重复表索引

    <?php $dbi = new DbMysql; $dbi->dbh = 'mysql://root:mysql@127.0.0.1/coffeetest'; $map = array( ...

  4. 【转】先说IEnumerable,我们每天用的foreach你真的懂它吗?

    [转]先说IEnumerable,我们每天用的foreach你真的懂它吗? 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq ...

  5. unity延时函数

    新建一个工具类 public class DelayToInvoke : MonoBehaviour{ public static IEnumerator DelayToInvokeDo(Action ...

  6. delphi 10 seattle 安卓服务开发(一)

    从delphi 开始支持安卓的开发开始, 安卓service 开发一直都是delphier 绕不过去的坎, 以前也有开发service  的方法,但是都是手工处理启动文件,而且要修改很多东西,基本上成 ...

  7. ubuntu安装rubyOnRails

    https://gorails.com/setup/ubuntu/16.04#ruby-rbenv 文章很详细

  8. windows无法卸载jdk的解决方法

    装了java之后非常纠结的就是无法卸载,总不能因为卸载一个jdk去重装系统,但是看着它残存在那又非常不爽, 因为卸载会牵扯注册表等琐碎的东西,,,后来在官网发现神器一枚,此神器就是java卸载工具. ...

  9. ZSetOperations 操作解释 拷贝过来的 哈哈哈

    有序集合,默认按照score升序排列,存储格式K(1)==V(n),V(1)=S(1)(K=key,V=value,S=score) 1.add(K,V,S):添加 2.count(K,Smin,Sm ...

  10. react native的注释

    在react native 中是这样写注释的: {/*这里是注释*/}