Bu yazımda ListView görünümünde verilerin nasıl yenileneceğini ele alacağız. Web Form’da tablo görünümünün serverside olarak yenilenmesi son değişiklikleri görme bakımından kullanıcı yenileme butonuna basması gerekmetedir. Biz bu gün bunu ortadan kaldıran bir mantığı icra edeceğiz
Uygulamanızın Module.Web projesinin altında Controller klasörünün altındal bir WindowController oluşturup aşağıdaki kod bloğunu uygulayınız.
public partial class AutoRefleshOnTimerMainWindowController : WindowController, IXafCallbackHandler
{
public AutoRefleshOnTimerMainWindowController()
{
InitializeComponent();
TargetWindowType = WindowType.Main;
}
protected override void OnActivated()
{
base.OnActivated();
Frame.ViewChanged += Frame_ViewChanged;
((WebWindow)Window).PagePreRender += AutoRefleshOnTimerMainWindowController_PagePreRender;
}
protected override void OnDeactivated()
{
Frame.ViewChanged -= Frame_ViewChanged;
((WebWindow)Window).PagePreRender -= AutoRefleshOnTimerMainWindowController_PagePreRender;
base.OnDeactivated();
}
private void AutoRefleshOnTimerMainWindowController_PagePreRender(object sender, EventArgs e)
{
WebWindow window = (WebWindow)sender;
string script = IsSuitableView() ? "window.startXafViewRefreshTimer(30000);" : "window.stopXafViewRefreshTimer();";
window.RegisterStartupScript(GetType().FullName, script);
}
private void Frame_ViewChanged(object sender, ViewChangedEventArgs e)
{
if(Frame.View != null)
Frame.View.ControlsCreated += View_ControlsCreated;
}
private void View_ControlsCreated(object sender, EventArgs e)
{
RegisterXafCallbackHandler();
}
void RegisterXafCallbackHandler()
{
if(XafCallbackManager != null)
XafCallbackManager.RegisterHandler("TimerCallback", this);
}
public void ProcessAction(string parameter)
{
if(IsSuitableView() && (Frame.View != null))
Frame.View.ObjectSpace.Refresh();
}
protected XafCallbackManager XafCallbackManager
{
get => WebWindow.CurrentRequestPage != null ? ((ICallbackManagerHolder)WebWindow.CurrentRequestPage).CallbackManager : null;
}
protected virtual bool IsSuitableView()
{
return Frame.View != null &&
Frame.View.IsRoot &&
!(Frame.View is DetailView) &&
!(Frame is NestedFrame) &&
!(Frame is PopupWindow);
}
}
Bu işlemimizi bitirdikten sonra sıra geldi projemizde Default.aspx dosyamızda değişiklik yapmaya
<script type="text/javascript">
window.xafViewRefreshTimer = null;
window.startXafViewRefreshTimer = function (delay) {
if (!window.xafViewRefreshTimer) {
window.xafViewRefreshTimer = window.setInterval(onXafViewRefreshTimer, delay);
}
}
window.stopXafViewRefreshTimer = function () {
if (window.xafViewRefreshTimer) {
window.clearInterval(window.xafViewRefreshTimer);
window.xafViewRefreshTimer = null;
}
}
window.isValidXafView = function () {
return !GetActivePopupControl(window.parent) || !GetActivePopupControl(window);
}
window.onXafViewRefreshTimer = function () {
if (isValidXafView()) {
RaiseXafCallback(globalCallbackControl, 'TimerCallback', '', '', false);
}
}
</script>
Artık web projemizde otomatik olarak her 30 saniyede bir Refresh yapacak kullanıcıyı böylelikle sürekli yenile butonuna mahkum etmekten kurtarmış olacağız.