2012-02-21 4 views
0

Я новичок в ASP.NET C# и пытается выполнить следующие действия:Обновление на основе результата другого элемента управления

Иметь страницу Default.aspx с двумя пользовательскими элементами управления (Control1.ascx и Control2.ascx) Оба пользовательских элемента управления находятся в пределах UpdatePanels.

Необходимо, чтобы TextBox на втором пользовательском элементе управления был отключен до тех пор, пока TextBox на первом элементе управления не будет проверен. После проверки необходимо активировать TextBox для пользовательского элемента управления2.

Эти элементы управления пользователями будут повторно использоваться на нескольких страницах. Помощь приветствуется. Если мне нужно опубликовать некоторый код, дайте мне знать.

Вот пример кода:

Default.aspx

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true" 
     CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<%@ Register src="Control1.ascx" tagname="CTL1" tagprefix="uc1" %> 
<%@ Register src="Control2.ascx" tagname="CTL2" tagprefix="uc2" %> 

<uc1:CTL1 Id="CTL1" runat="Server" UpdateMode="Conditional"/> 
<uc2:CTL2 Id="CTL2" runat="Server" UpdateMode="Conditional"/> 

Default.aspx.cs

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

    } 
} 

Control1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Control1.ascx.cs" Inherits="Control1" %> 
<asp:UpdatePanel ID="UpdatePanel_Fld1" runat="server" UpdateMode="Conditional"> 
<ContentTemplate> 
    <asp:TextBox ID="TextBox_Fld1" runat="server" Enabled="True" ></asp:TextBox> 
    <asp:ImageButton ID="ImageButton_ValidateFld1" runat="server" ImageUrl="~/images/validate.jpg" 
     onclick="ImageButton_ValidateFld1_Click" /> 
    <asp:Label ID="LabelFld1Summary" runat="server" >&nbsp;</asp:Label> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Control1.ascx.cs

public partial class Control1 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     } 
     public void ImageButton_ValidateFld1_Click(object sender, ImageClickEventArgs e) 
     { 
      LabelFld1Summary.Text = "Validated"; 
     } 
    } 

Control2.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Control2.ascx.cs" Inherits="Control2" %> 
<asp:UpdatePanel ID="UpdatePanel_Fld2" runat="server" UpdateMode="Conditional"> 
<ContentTemplate> 
    <asp:TextBox ID="TextBox_Fld2" runat="server" Enabled="False"></asp:TextBox> 
    <asp:ImageButton ID="ImageButton_ValidateFld2" runat="server" ImageUrl="~/images/validate.jpg" 
     onclick="ImageButton_ValidateFld2_Click" /> 
    <asp:Label ID="LabelFld2Summary" runat="server" >&nbsp;</asp:Label> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Control2.ascx.cs

public partial class Control2 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     } 
     public void ImageButton_ValidateFld2_Click(object sender, ImageClickEventArgs e) 
     { 
      LabelFld2Summary.Text = "Validated"; 
     } 
    } 
+3

Вы должны отправить код, тогда только кто-нибудь может помочь –

+0

Вы уверены, что это должны быть отдельные UserControls? Похоже, там есть довольно сильная связь. –

+0

они оба в той же самой обновленной панели? можете ли вы опубликовать часть своей разметки? – Greg

ответ

0

я предложить г o с помощью простого javascript или включить jQuery для включения/отключения функции, добавить код js в скрипт проверки на стороне клиента

+0

Я работаю правильно прямо сейчас без пользовательских элементов управления, но поскольку некоторые из полей понадобятся на других страницах, я хотел бы использовать пользовательские элементы управления, а не дублировать код. Спасибо. – Sam

0

Я предлагаю сначала создать сценарий, работающий с синхронными обратными передачами, а затем добавив обновленные панели в микс. В качестве грубого эскиза на стороне сервера OnClick обработчик для какой-либо кнопки или другого вы можете установить включенность второго элемента управления на основании результата проверки первого элемента управления. Затем вам просто нужно убедиться, что вы вызываете Update() на UpdatePanel Control2.ascx, когда происходит асинхронное обратное таргетинг на UpdatePanel Control1.ascx.

При этом это будет мягко раздражать с точки зрения пользователя. Если первый элемент управления не модулирует большое количество пользовательского интерфейса ниже (например, переключение на отдельный набор управления), почему бы просто не позволить вашим пользователям вводить текст в оба поля и проверять их на комбинацию?

+0

Поле 1 необходимо проверить, пытаясь контролировать поток. Будут и другие приемы. – Sam

0

Я согласен с Саймоном. jQuery, вероятно, будет самым простым способом для этого. вы можете использовать методы ajax jQuery для совершения вызовов в WebMethods, если вам нужно взаимодействовать с кодом по какой-либо причине.

Я использовал панели обновления, а интерфейс ICallbackEventHandler (http://madskristensen.net/post/Asynchronous-GridView-in-5-simple-steps.aspx - хороший пример его использования) с некоторым успехом.

Хотя я стараюсь держаться подальше от UpdatePanels, я понял, что они используют интерфейс ICallbackEventHandler за кулисами, и я, вероятно, делаю больше работы для себя. Единственное преимущество в том, что я сделал это, так это то, что у меня нет кучи мусора, сидящего на моем ViewState (UpdatePanels love ViewState), поскольку я сохранил его в состоянии сеанса на стороне сервера.

В моем случае причина перехода метода ICallbackEventHandler с использованием jQuery-ajax-вызовов и WebMethods в код позади заключалась в том, что я хотел иметь доступ к нестатическим полям (включая веб-элементы управления). Оказывается, мне нужно было вручную сохранять данные, отображаемые на странице, в сеансе или иначе, и, возможно, в конечном итоге все больше работали для себя. Это был хороший шанс узнать что-то новое, но преимущества, которые я получил от доступа к элементам управления страницами, были минимальными/несуществующими.

Смежные вопросы