2015-01-13 68 views
1

我有一個稱爲「DynamicGrid」的UserControl,它在各個頁面上用於在分配數據集時製作動態網格。網格有文本框來編輯/插入數據。現在我得到了一個要求,即每當用戶點擊進入網格的最後一個文本框時,它應該在其網格中輸入一個新行,此功能以前是通過按鈕的單擊事件實現的。所以,我迷上了一些JavaScript的最後文本框這樣當用戶控件調用Web服務時,asp.net頁面爲null

if (gv != null && gv.Rows.Count > 0) 
{ 
    GridViewRow lastRow = gv.Rows[gv.Rows.Count - 1]; 
    var controls = lastRow.Controls[lastRow.Controls.Count - 1].Controls[0]; 
    TextBox txtbx = ((TextBox)lastRow.Controls[lastRow.Controls.Count - 1].Controls[0].Controls[0]); 

    string script = string.Format(@" 
$(document).ready(function() {{ 
    $('#{0}').bind('keyup', function (e) {{ 
     {{ 
      if (e.keyCode === 13) {{ 
       {{ 
        $('#{0}').css('border', '1px dashed red'); 
        $.ajax({{ 
         type: 'POST', 
         url: '{1}', 
         contentType: 'application/json; charset=utf-8', 
         dataType: 'json', 
         async: false, 
         data: '{{ GridViewID: ""{2}"" }}', 
         success: function (data) {{ 
          alert(data.d); 
         }}, 
         error: function (xhr) {{ 
          alert('An error occurred: ' + xhr.status + ' ' + xhr.statusText + ' ' + xhr.responseText); 
         }} 
        }}); 
       }} 
      }} 
     }} 
    }}); 
}});", txtbx.ClientID, "../../../WebService/DynamicGridAddRow.asmx/AddNewRow", gv.ClientID); 

    ScriptManager.RegisterClientScriptBlock(this, Page.GetType(), "script", script, true); 
} 

在我的web服務我使用了代理來調用先前在按鈕的單擊事件中使用的addrow方法

[WebMethod] 
public void AddNewRow(string GridViewID) 
{ 
    wucDynamicGrid dynamicGrid = new App_Controls.wucDynamicGrid(); 
    AddNewRowToDynamicGrid newRow = new App_Controls.AddNewRowToDynamicGrid(dynamicGrid.addRow); 
    newRow(GridViewID); 
} 

這是增加新的方法

public void addRow(string GridID) 
{ 
    //GridView gv = (GridView)this.Page.FindControl(GridID); 
    Page p = HttpContext.Current.Handler as Page;   
    var controls = APP_Common.CommonFunctions.FindControl<GridView>(this.NamingContainer.Controls); 
    GridView gv = controls; 
    AddNewRowToDynamicGrid(gv); 
} 

的問題是頁面總是空等等都是家長,NamingContainer和HttpContext.Current.Handler性能。我需要找到動態添加網格的ID,以便我可以添加一個新行。我在這裏堅持了2天,我知道這裏有一個非常基本的錯誤,請指導我

+0

感謝您的快速響應,它不完全與我的問題完全相關,因爲頁面已完全加載(用戶控件也是如此) –

+0

我想我需要配置我的Web服務以某種方式訪問​​頁面,但是如何: –

回答

0

經過對此的一些研究,我決定不使用web服務,因爲HttpContext.Current.CurrentHandler是一個web服務處理程序因爲這個方法是由webservice調用的。我搜索配置它使用當前頁面,但不能這樣做。然後我使用手冊Postback來做同樣的功能檢查我的網格lastRow的最後一個文本框,並把它們放在會話中。現在在我的頁面的Page_LoadComplete我把它們放在頁面上,通過ScriptManager.RegisterStartupScript,並使用__doPostBack將所需的數據發佈到我的方法。

if (e.keyCode === 13) {{ 
    $('#{0}').css('border', '1px dashed green');     
    __doPostBack('{1}', '{2}');    
}} 

添加一個按鈕,這樣我可以生成從上面的代碼

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="btnHiddenNewRowAdd" EventName="Click" /> 
    </Triggers> 
</asp:UpdatePanel> 
<asp:Button ID="btnHiddenNewRowAdd" runat="server" style="display:none;" /> 

法律局部回傳,然後在我的用戶的稱爲頁面加載「DynamicGrid」我檢查由MS創建的隱藏字段AJAX __EVENTTARGET__EVENTARGUMENT並稱爲addoRow方法

string eventTarget = Request.Form["__EVENTTARGET"]; 
if (eventTarget != null && eventTarget.Length > 0) 
{ 
    string parameter = Request.Form["__EVENTARGUMENT"]; 
    if (parameter != null && parameter.Length > 0) 
     addRow(parameter); 
} 

現在我認爲這是愚蠢的我要搜索的頁面時REQ uest是從Web Service生成的,它與Page LifeCycle無關,所以這就是爲什麼沒有PageParentNamingContainer。因爲之前我沒有使用過__doPostBack,所以我正在尋找Web服務。

相關問題