I figured out how to handle both of those other cases by extending the custom view:
<script>
function refreshView(target) {
var opts = $(target).datagrid('options');
var vc = $(target).datagrid('getPanel').children('div.datagrid-view');
vc.children('div.datagrid-empty').remove();
if (!$(target).datagrid('getRows').length){
var d = $('<div class="datagrid-empty"></div>').html(opts.emptyMsg || 'no records').appendTo(vc);
d.css({
position:'absolute',
left:0,
top:50,
width:'100%',
textAlign:'center'
});
}
}
var myview = $.extend({},$.fn.datagrid.defaults.view,{
onAfterRender:function(target){
$.fn.datagrid.defaults.view.onAfterRender.call(this,target);
refreshView(target);
},
insertRow: function(target, index, row) {
$.fn.datagrid.defaults.view.insertRow.call(this, target, index, row);
refreshEmpty(target);
},
deleteRow: function(target, index) {
$.fn.datagrid.defaults.view.deleteRow.call(this, target, index);
refreshEmpty(target);
}
});
</script>