2013-10-24 2 views
0

FormView의 모드에 따라 업데이트 또는 삽입 작업을 수행 할 수있는 FormView가있는 RadWindow 대화 상자가 필요합니다. RadWindow 대화 상자를 만들고 컨트롤 (FormView)을 내용으로 추가하고 데이터 바인딩을 통해 FormView의 내용을 채 웁니다. 저장, 삽입 또는 취소 작업을 수행하기 전까지는 문제가없는 것 같습니다. 해당 이벤트는 시작되지 않습니다.FormView가 ChangeMode 이후에 이벤트를 처리합니다.

모드를 변경 한 후에 FormView가 ItemCommand 또는 다른 이벤트를 호출하지 않는 것 같습니다. 아무도 통찰력을 가지고 있습니까?

기본 페이지와 RadWindow 만있는 간단한 예제로이 기능을 추출 할 수있었습니다.

여기 내 마크 업입니다 :

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server" /> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> 
     <Scripts> 
      <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.Core.js" /> 
      <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQuery.js" /> 
      <asp:ScriptReference Assembly="Telerik.Web.UI" Name="Telerik.Web.UI.Common.jQueryInclude.js" /> 
     </Scripts> 
    </telerik:RadScriptManager> 
    <script type="text/javascript"> 
     function CloseDialog() { 
      alert("Close Dialog func"); 
      var window = $find("<%=dialogWnd1.ClientID %>"); 
      window.close(); 
     } 
    </script> 
    <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"> 
    </telerik:RadAjaxManager> 
    <telerik:RadButton runat="server" ID="openEditDialogBtn" Text="Edit Dialog" OnClick="OnEditModeClick"> 
    </telerik:RadButton> 
    <telerik:RadButton runat="server" ID="openInsertDialogBtn" Text="Insert Dialog" OnClick="OnInsertModeClick"> 
    </telerik:RadButton> 
    <telerik:RadWindowManager runat="server" ID="DialogWindowManager"> 
     <Windows> 
      <telerik:RadWindow runat="server" ID="dialogWnd1"> 
       <ContentTemplate> 
        <asp:UpdatePanel runat="server" ID="updatePanel1" UpdateMode="Conditional" OnUnload="UpdatePanel_Unload_Workaround"> 
         <ContentTemplate> 
          <div> 
           <asp:FormView ID="formView1" runat="server" DefaultMode="ReadOnly" DataSourceID="FormViewDataSourceID" 
            OnItemCommand="formView1_OnItemCommand"> 
            <ItemTemplate> 
             <table> 
              <tr> 
               <td> 
                Data Id (ITEM) 
               </td> 
               <td> 
                <telerik:RadTextBox ID="txtDataId" runat="server" Text='<%# Bind("DataId") %>' Enabled="False" /> 
               </td> 
              </tr> 
             </table> 
            </ItemTemplate> 
            <EditItemTemplate> 
             <table> 
              <tr> 
               <td> 
                Data Id (EDIT) 
               </td> 
               <td> 
                <telerik:RadTextBox ID="txtDataId" runat="server" Text='<%# Bind("DataId") %>' /> 
               </td> 
              </tr> 
             </table> 
             <div> 
              <telerik:RadButton runat="server" CommandName="Update" Text="Save"> 
              </telerik:RadButton> 
              <telerik:RadButton runat="server" CommandName="Cancel" Text="Cancel"> 
              </telerik:RadButton> 
             </div> 
            </EditItemTemplate> 
            <InsertItemTemplate> 
             <table> 
              <tr> 
               <td> 
                Data Id (INSERT) 
               </td> 
               <td> 
                <telerik:RadTextBox ID="txtDataId" runat="server" Text='<%# Bind("DataId") %>' /> 
               </td> 
              </tr> 
              <tr> 
               <td> 
                Description 
               </td> 
               <td> 
                <telerik:RadTextBox ID="txtDescription" runat="server" Text='<%# Bind("Description") %>' /> 
               </td> 
              </tr> 
             </table> 
             <div> 
              <telerik:RadButton runat="server" CommandName="Insert" Text="Insert"> 
              </telerik:RadButton> 
              <telerik:RadButton runat="server" CommandName="Cancel" Text="Cancel"> 
              </telerik:RadButton> 
             </div> 
            </InsertItemTemplate> 
           </asp:FormView> 
          </div> 
         </ContentTemplate> 
        </asp:UpdatePanel> 
       </ContentTemplate> 
      </telerik:RadWindow> 
     </Windows> 
    </telerik:RadWindowManager> 
    <asp:ObjectDataSource runat="server" ID="FormViewDataSourceID" TypeName="FormViewDataSource" 
     DataObjectTypeName="DataModel" SelectMethod="Select" UpdateMethod="Update" InsertMethod="Insert"> 
     <SelectParameters> 
      <asp:Parameter runat="server" Name="id" Type="Int32" /> 
     </SelectParameters> 
    </asp:ObjectDataSource> 
    <div> 
    </div> 
    </form> 
</body> 
</html> 

그리고 코드 숨김 :

public partial class Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void UpdatePanel_Unload_Workaround(object sender, EventArgs e) 
    { 
     var methods = typeof(ScriptManager).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance); 
     var methodInfo = methods.Where(i => i.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel")).First(); 
     methodInfo.Invoke(ScriptManager.GetCurrent(Page), new object[] { sender as UpdatePanel }); 
    } 

    protected void OnEditModeClick(object sender, EventArgs e) 
    { 
     FormViewDataSourceID.SelectParameters[0].DefaultValue = "2"; 
     formView1.ChangeMode(FormViewMode.Edit); 

     OpenDialog(); 
    } 

    protected void OnInsertModeClick(object sender, EventArgs e) 
    { 
     formView1.ChangeMode(FormViewMode.Insert); 

     OpenDialog(); 
    } 

    private void OpenDialog() 
    { 
     StringBuilder windowShowScript = new StringBuilder(); 
     windowShowScript.Append("var oWindow = $find(\"").Append(dialogWnd1.ClientID).Append("\");"); 
     windowShowScript.Append("oWindow.show();"); 

     RadAjaxManager.GetCurrent(Page).ResponseScripts.Add(windowShowScript.ToString()); 
    } 

    protected void formView1_OnItemCommand(object sender, FormViewCommandEventArgs e) 
    { 
     if (e.CommandName.Equals("Cancel") || e.CommandName.Equals("Insert") || e.CommandName.Equals("Update")) 
     { 
      // close rad window 
      ScriptManager.RegisterStartupScript(updatePanel1, updatePanel1.GetType(), "cancelScript", "CloseDialog();", true); 
     } 
    } 
} 

public class DataModel 
{ 
    public string DataId { get; set; } 
    public string Description { get; set; } 
} 

public class FormViewDataSource 
{ 
    private List<DataModel> models = new List<DataModel>() 
      { 
       new DataModel() 
        { 
         DataId = "1", 
         Description = "First Event" 
        }, 
       new DataModel() 
        { 
         DataId = "2", 
         Description = "Second Event" 
        } 
      }; 

    public IEnumerable<DataModel> Select(int id) 
    { 
     return models.Where(i => i.DataId.Equals(id.ToString())); 
    } 
    public void Update(DataModel model) 
    { 
     var foundModel = models.Find(i => i == model); 
     if (foundModel != null) 
     { 
      foundModel.DataId = model.DataId; 
      foundModel.Description = model.Description; 
     } 
    } 

    public void Insert(DataModel model) 
    { 
     models.Add(model); 
    } 
} 
+0

FormView를 별도로 (RadWindow없이) 사용하면 예상대로 이벤트가 발생한다는 것을 추가하고 싶습니다. – Robertas

답변

0
자신의 ContentTemplates가 RadWindowManager에서 사용되는 당신의 RadWindows 이동

. 그런 다음 업데이트 패널에 대한 반사 해결 방법이 더 이상 필요하지 않습니다.

+0

'RadWindowManager'에서'RadWindow'를 움직이면 이벤트 발생 문제도 해결됩니다. – Robertas

+0

그건 내 주요 요점이었다. 나는 그것을 아주 잘 설명하지 못했던 것 같다. – rdmptn

관련 문제