2011-09-27 96 views
1

我已经自己解决了一些问题 - 我不确定没有重构代码的优雅方式。我有其运行的服务器侧定时器,并且它需要模拟点击RadTabStrip.从服务器端触发OnClientCommand的最佳方法?

客户端我有以下的方法的一个选项卡:

function OnClientTabSelected(sender, eventArgs) 
{ 
    FixSplitter($find(rightPaneID)); 
} 

FixSplitter依赖于额外的控制,但:

function FixSplitter(sender, eventArgs) 
{ 
    var multiPage = $find(multiPageID); 
    ... 
} 

现在,服务器端的,我有以下几点:

public void DoTimerCycleTick(object sender, TimerEventArgs eventArgs) 
{ 
    GlobalSettings globalSettings = StateManager.GetStates<GlobalSettings>(); 

    if(globalSettings.CycleEnabled) 
    { 
     if (!Equals(DateTime.Now.CompareTo(globalSettings.TimeLastCycled.AddMinutes(globalSettings.CycleInterval)), -1)) //CompareTo returns -1 when time is earlier than. 
     { 
      int nextIndex = SelectedIndex + 1; 

      if(nextIndex == Tabs.Count) 
      { 
       nextIndex = 0; 
      } 

      SelectedIndex = nextIndex; 
      LayoutManager.Instance.MultiPage.SelectedIndex = nextIndex; 
      LayoutManager.Instance.MultiPageUpdatePanel.Update(); 
      //ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "KEY", "OnClientTabSelected();", true); 
      globalSettings.TimeLastCycled = DateTime.Now; 
     } 
    } 

    StateManager.SaveGlobalSettings(globalSettings); 
} 

这段代码的相关位是我设置索引的地方。显然,这不会触发OnClientTabSelected方法。然而,我需要运行FixSplitter方法。

所以,我认为这个惊喜的快速解决方案是注册一个客户端脚本。事实上,如果不是依赖多页面,这可能就足够了。由于我的多页包装在当前正在更新的UpdatePanel中,因此无法使用$find(multiPageID). $ find(multiPageID)返回null,因为$find(rightPaneID)返回期望的对象 - 两个声明都是相同的,并且代码在所有其他情况下都能顺利工作。我有信心说罪魁祸首是UpdatePanel。

除了创建一个与OnClientTabSelected完全相同的新方法外,我还有其他选择,除了强制MultiPageUpdatePanel在执行后回发 - 而不是在UpdatePanel服务器端调用Update吗?

我认识到这个问题存在更深层的问题,但它是未完成的代码,无法再分解几个星期。

编辑:经过一番工作,这里是我提出的解决方案。接受批评,我不是这方面的专家。 :)

/// <summary> 
/// Performs one tick of a timer on the chart. 
/// Ticks based on time for testability and to prevent 
/// weird cases when skipping the clock time forward. 
/// </summary> 
public void DoTimerCycleTick(object sender, TimerEventArgs eventArgs) 
{ 
    GlobalSettings globalSettings = StateManager.GetStates<GlobalSettings>(); 

    if(globalSettings.CycleEnabled) 
    { 
     if (!Equals(DateTime.Now.CompareTo(globalSettings.TimeLastCycled.AddMinutes(globalSettings.CycleInterval)), -1)) //CompareTo returns -1 when time is earlier than. 
     { 
      int oldIndex = SelectedIndex; 
      int newIndex = (oldIndex + 1) != Tabs.Count ? (oldIndex + 1) : 0; 

      SelectedIndex = newIndex; 
      LayoutManager.Instance.MultiPage.SelectedIndex = newIndex; 
      //LayoutManager.Instance.MultiPageUpdatePanel.Update(); 
      ScriptManager.RegisterStartupScript(Page, Page.GetType(), "KEY", string.Format("OnServerTabSelected({0});", newIndex), true); 
      globalSettings.TimeLastCycled = DateTime.Now; 
     } 
    } 

    StateManager.SaveGlobalSettings(globalSettings); 
} 

var showLoadingPanel = true; 

function OnServerTabSelected(newIndex) { 
    var oldID = $find(multiPageID).get_selectedPageView().get_id(); 
    var newID = $find(multiPageID).get_pageViews().getPageView(newIndex).get_id(); 

    if ($telerik.$("#" + oldID).is(":visible")) { 
     $telerik.$("#" + oldID).fadeOut(1000, function() { 
      $telerik.$("#" + newID).fadeIn(1000, function() { 
       showLoadingPanel = true; 
       $find(multiPageID).set_selectedIndex(newIndex); 
      }); 
     }); 

     showLoadingPanel = false; 
     FixSplitter($find(rightPaneID)); 
     return; 
    } 
} 

回答

1

你就不能超载FixSplitter方法,即需要这两个paramters,确实查找,然后调用其他方法与所有3个参数?这样,您可以随时在需要时覆盖multiPage值;

function FixSplitter(sender, eventArgs) 
{ 
    var multiPage = $find(multiPageID); 
    FixSplitter(sender, multiPage, eventArgs); 
} 

function FixSplitter(sender, multiPage, eventArgs) 
{ 
    ... 
} 

如果因某种原因无法重载,可以使用DoFixSplitter之类的替代符号。

相关问题