2011-05-28 14 views
2

ユーザーコントロールからaspxページに値を渡すときに問題が発生しました。ユーザーコントロールには、顧客を検索するためのボタンと結果を表示するためのグリッドビューを備えた2つのテキストボックスがあります。選択ボタンをクリックすると、その値をpage.aspxに渡します。クリックされると、modalpopupextenderが表示されるボタンがあります。ユーザーコントロールの値をメインページに渡すaspx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="searchCommittente.ascx.cs" Inherits="Assistenze_ControlliCustom_searchCommittente" %> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %> 


<asp:TextBox runat="server" ID="lblNomeCommittente"/> 
<asp:Button runat="server" ID="btnShow" Text="Cerca Committente" /> 
<asp:ModalPopupExtender runat="server" Y="155" ID="mpeCercaCommittente" TargetControlID="btnShow" OkControlID="btnSearch" 
    PopupControlID="pnlPopupContainer" CancelControlID="spnClose" BehaviorID="mpeCercaCommittente"/> 
<asp:Panel runat="server" ID="pnlPopupContainer" CssClass="pnlPopupContainer"> 
<span id="spnClose"></span> 
    <asp:UpdatePanel runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
     <h2>Find Customer</h2> 
     <%=DateTime.Now%> 
      <asp:Panel runat="server" > 
       Referente : 
       <asp:TextBox ID="txtNomeReferente" runat="server" AutoPostBack="true"></asp:TextBox> 
       &nbsp;Committente : 
       <asp:TextBox ID="txtNomeCommittente" runat="server" AutoPostBack="true"></asp:TextBox> 
       &nbsp; 
       <asp:Button ID="btnSearch" runat="server" Text="Search" onclick="btnSearch_Click" 
        CausesValidation="false" UseSubmitBehavior="false" /> 

      </asp:Panel> 
      <p /> 
      <asp:GridView ID="gvCommittenti" runat="server" AutoGenerateColumns="False" 
       AllowPaging="true" EnableViewState="False" 
       DataKeyNames="CustomerID" 
       DataSourceID="EntityDataSourceCommittenti" 
       OnSelectedIndexChanged="gvCommittenti_SelectedIndexChanged"> 

       <Columns> 
        <asp:CommandField ShowSelectButton="True" /> 
        <asp:BoundField DataField="CustomerID" HeaderText="Customer ID" SortExpression="CustomerID"/> 
        <asp:BoundField DataField="CompanyName" HeaderText="Company Name" SortExpression="CompanyName" /> 
        <asp:BoundField DataField="ContactName" HeaderText="Contact Name" SortExpression="ContactName" /> 
        <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" /> 
       </Columns> 
      </asp:GridView> 
     </ContentTemplate> 
     <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="btnSearch" EventName="Click" /> 
     </Triggers> 
    </asp:UpdatePanel> 

</asp:Panel> 
<asp:EntityDataSource ID="EntityDataSourceCommittenti" runat="server" OrderBy="" 
    ConnectionString="name=NorthwindEntitiesCommittenti" 
    DefaultContainerName="NorthwindEntitiesCommittenti" EntityTypeFilter="" 
    EntitySetName="Customers" EnableFlattening="false" 
    Select="it.[CustomerID], it.[CompanyName], it.[ContactName], it.[Phone]" Where="it.[CompanyName] like @CompanyName" 
    AutoGenerateOrderByClause="True"> 
    <WhereParameters> 
     <asp:FormParameter FormField="txtNomeCommittente" Name="CompanyName" DefaultValue="%" Type="String" /> 
    </WhereParameters> 
    <OrderByParameters> 
     <asp:Parameter DefaultValue="it.[CustomerID]" Name="prmCustomerID" 
      Type="String" /> 
    </OrderByParameters> 

</asp:EntityDataSource> 

私は、このイベントで試してみたが、何も起こりません:

txtTitoloがメインのaspxページ上のテキストボックスである
protected void gvCommittenti_SelectedIndexChanged(object sender, GridViewSelectEventArgse) 
    { 
     ((TextBox)Page.FindControl("ctl00$Body$txtTitolo")).Text = (string)gvCustomers.DataKeys[e.NewSelectedIndex][0]; 
        mpeCercaCommittente.Hide(); 
    } 

ティコードです。

誰かが私にこれでブロックされている3日間私を助けることができます。

ありがとうございます。

----- EDIT ---- おかげブライアン、 私はあなたのポストにいくつかの変更を加えましたが、今では最終的に取り組んでいます。あなたは、私が国連のUpdatePanelでThextoBoxを入れて言ったように

:私は私D'ONTが知っている(Delgateを制御しますが、あなたが私を書いたように私が行った場合、ユーザーの中に作成たより

、Visual Studioの2010)は、凍結行ってきました:私は、GridViewコントロールの選択ボタンをクリックして今すぐ

public partial class Assistenze_ControlliCustom_searchCommittente : System.Web.UI.UserControl 
    { 
     public delegate void CommittenteSelectedHendler(string text); 

     public event CommittenteSelectedHendler custom; 
......................... 

、この機能が起動します:このようにして

protected void gvCommittenti_SelectedIndexChanged(object sender, GridViewSelectEventArgs e) 
    { 

     if (custom != null) 
     { 
      string eventText = (string)gvCommittenti.DataKeys[e.NewSelectedIndex][0]; 
      custom(eventText); 
     } 
     mpeCercaCommittente.Hide(); 
    } 
メインページは手続きsetTextBoxを発射登録されたイベント 使用してテキストボックスを更新:完成

public partial class Assistenze_AssistenzeIngresso : System.Web.UI.Page 
     { 

      protected void Page_Load(object sender, EventArgs e) 
      { 
       ucCommittenteSearch.custom += new Assistenze_ControlliCustom_searchCommittente.CommittenteSelectedHendler(setTextBox); 
       chkFattura.Attributes.Add("onclick", "return cmode_check(this)"); 
       Master.IdBody = "assistenze"; 
      } 
      private void setTextBox(string text) 
      { 
       //set the text 
        txtCommittenteViewName.Text = text; 
        //update the page to reflect the change: 
        UpdatePanel1.Update(); 
       } 
..................................................... 

ミッションを!

+0

なぜ、EnableViewState = "False"でしたか? – ibram

+0

それ以外の場合は、フィルタ(txtNomeReferente、txtNomeCommittenteおよびbtnSearch)が機能しません。 – AlessandroG

答えて

1

最初に覚えておきたいのは、部分的な投稿を使用してページを更新しているため、テキストボックスのサーバー側の表示がメインページで更新されていないことです。それが唯一の問題ではないと仮定すると、過去にこれを行った最善の方法は、コントロールが呼び出すことができる委任されたイベントを使用して、ページがコントロールにサブスクライブすることです。メインのコードビハインドで

<asp:UpdatePanel ID="upd1" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:TextBox ID="txtTitolo" runat="server"></asp:TextBox> 
    </ContentTemplate> 
</asp:UpdatePanel> 

:あなたはまた、条件付きのアップデートでマークされ、更新パネルの内側に更新したいテキストボックスを持っていることを確認してください、あなたのメインページで、起動するには

(名前空間レベルでは、NOTページレベルで)ページ、イベントのデリゲートを追加します。

namespace WebUserControlTalksToPage 
{ 
    //create the delegate to handle user-control updating page controls 
    public delegate void setPageText(string text); 

    public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      // we'll add here in a second. 
     } 
    } 
} 

次に、あなたがページに話をしたいユーザーコントロール(GridViewコントロールを使用して場合の1に入ります)、発生させるイベントを追加します。

public partial class SomeUserControl : System.Web.UI.UserControl 
{ 
    //create a public event on the delegate type defined in the namespace: 
    public event setPageText reporter; 

    public void Page_Load(object sender, EventArgs e) 
    { 
     //.... 
    } 
} 

次に、あなたは、あなたのケースで(gvCommittenti_SelectedIndexChangedイベントを、それを調達したいイベントにリポーターイベントを追加します。

protected void gvCommittenti_SelectedIndexChanged(object sender, GridViewSelectEventArgse) 
{ 
    //NOTE: you can add this in any event where you want 
    //to raise the event to the subscribers. 
    if (reporter != null) 
    { 
     //note: I separated this because I'm not testing your string. You will need 
     //  to make sure the string you are sending is correct: 
     string eventText = (string)gvCustomers.DataKeys[e.NewSelectedIndex][0]; 

     //this will raise the event to all subscribers: 
     reporter(eventText); 
    } 
} 

次は、応答するために戻ってページのハンドラを追加する必要があります(購読する)。メインのpage_loadに次のイベントを追加します。

protected void Page_Load(object sender, EventArgs e) 
{ 
    //'reporter' is the name of the event on the control 
    //setPageText is the name of the delegate event 
    //setTextBox is the event we will write to handle the raised event from the user control 
    //SomeUserControl1 is a variable name, replace with your UC name as defined in your page 
    this.SomeUserControl1.reporter += new setPageText(setTextBox); 
} 

最後に、メインページのユーザーコントロールによって発生したイベントを処理する必要があります。ユーザーコントロールは、部分ページポストバックをやっているので、あなたは私の応答の開始時に述べたように、テキストが含まれているパネルを更新することを確認したいと思う:

private void setTextBox(string text) 
{ 
    //set the text 
    this.txtTitolo.Text = text; 
    //update the page to reflect the change: 
    upd1.Update(); 
} 

これはあなたの問題を解決する必要があります。応答について何かが不明瞭で混乱しているかどうかを教えてください。

関連する問題