2

解決済み

質問を解決するように設定するにはどうすればよいですか?笑

とにかくここに解決策があります、私は私の友人に私を助けてもらいました、そして彼はそれをしました!

最初に、私が更新パネルを使用していたので、jQueryはそれからの部分的なポストバックを登録しませんでした。それが主な問題でした。更新パネルなしで機能しなかった理由の少し少ない問題は、クリック時の関数の1と0の値が誤って交換されたことでした。

したがって、最初にOnInitメソッドをオーバーライドしましたが、同じコードをページロードに配置することもできます(initコードofcに基づく呼び出しを除く):):

protected override void OnInit(EventArgs e)
    {


        base.OnInit(e);

        prikazi.Attributes.Add("onclick", "return LinkKlik();");


        ScriptManager.RegisterStartupScript(this, this.GetType(), "init", "checkComponent();", true);
    }

非同期ポストバックがある場合でも、ページが再初期化されるたびに実行するスクリプトを登録します:)ここでも、リンクボタンにクリック関数を追加します。

jqueryコードは次のとおりです。

function checkComponent() {
    //
    if (document.getElementById('hidTracker').value == '1') {
        $(".sokrij").show();

    }
    else {
        $(".sokrij").hide();
    }
}

function LinkKlik() {

    var panel = $("#fioka").find(".sokrij");

    if (panel.is(":visible")) {
        panel.slideUp("500");
        $('#hidTracker').attr("value", "0");

    }
    else {
        panel.slideDown("500");
        $('#hidTracker').attr("value", "1");

    }
    // that's it folks! (return false to stop the browser jumping the the '#' link
    return false;
}

これは基本的に以前と同じですが、上記のオーバーライドによってイベントにリンクされた2つの関数に分割されています。

最後に、これらが必要です。

        <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <script type="text/javascript" src="drawer.js"></script>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
            <asp:HiddenField ID="hidTracker" runat="server" Value="0" />
            <div id="fioka">
                <asp:LinkButton runat="server" href="#" ID="prikazi">Click This to show/close</asp:LinkButton>
                <div class="sokrij" id="sokrij">
                    HIDE THIS!!!
                </div>
            </div>
            <asp:Button ID="Button1" runat="server" Text="Button" />
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="prikazi" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>

更新パネル内でも機能します。ボタンはポストバックを生成するためにあり、更新パネルの外側に実際のポストバックを生成するためにボタンを外側に配置することもできます。状態の値は非表示フィールドに記録され、リンクボタンは表示/非表示に使用するものです。誰かがこれを必要とするなら、乾杯。同じことについてたくさんの投稿を見たが、誰もそれに答えなかったから。

答えてくれてありがとう、特にCRAB BUCKET

可能であれば、すべて+ repを指定しますが、開始したばかりであることがわかります。

ポストバックを行うさまざまな要素を持つコントロールがあります。更新パネルのメインページにそのコントロールがあり、うまく機能します。私がやりたいのは、要素の半分を非表示にし、ボタンがクリックされたときにのみ表示できるようにすることです。いくつかのjQueryドロワーを見つけることができましたが、問題はありませんでしたが、パネルを開いて、クリックまたは値の変更時にac#関数を呼び出すようにポストバックのある要素を変更すると、ドロワーが開きます([ドロワーを開く]リンクを押しても) )。

私の要素にはポストバックが必要です!そして私はそれらの半分を隠すためにその引き出しのshow/hidethingieが必要です...

これが私がこれまでに引き出しに持っていたもので、自分でいくつかのコードをまとめています。このコードで言ったように、ポストバックの原因となるボタンをクリックすると、開いているドロワーのリンクをクリックしなくても、ポストバックの後にドロワーが開きます。それ以外はポストバック間で問題なく動作しますが、ポストバックでも動作させる必要があります。

$(function () {

$(".sokrij").hide(),


$("#prikazi").live("click", function (evt) {
        evt.preventDefault();

        $("#fioka").find(".sokrij").each(function () {

            if ($(this).is(":visible")) {
                $(this).slideUp("500");
            }
        });

        if ($(this).next().is(":hidden")) {
            $(this).next().slideDown("500");
        }

        return false;
    });


});

ポストバックが引き出しの状態に影響を与えないようにする方法が必要です。開いている場合はポストバック後も開いたままにし、閉じている場合はポストバック後も閉じたままにします。つまり、状態を記憶し、ポストバックのたびに確認する必要があるということです。

これが私のタグ構造です。

<div id="fioka">
    <a href="#" ID="prikazi">Click This to show/close</a>
    <div class="sokrij">
</div>
</div>

主な編集:

Crab Bucketからの入力後、私が今持っているものは次のとおりです。

タグ構造:

<input type="hidden" ID="hidTracker" value="0" />    
<div id="fioka">
             <a href="#" ID="prikazi">Click This to show/close</a>
             <div class="sokrij">
         </div>
         </div>

これはすべて、ポストバックを生成するボタンがある更新パネル内にありますが、これらのポストバックはメインページを更新せず、更新パネル内に含まれています。

そしてjQueryコードはこれまでのところ:

$(document).ready(function () {

if ($('#hidTracker').val() == '1') {
    $(".sokrij").show();
}
else {
    $(".sokrij").hide();

}



  $("#prikazi").live("click", function (evt) {
      evt.preventDefault();

      var panel = $("#fioka").find(".sokrij");

      if (panel.is(":visible")) {
          panel.slideUp("500");
          $('#hidTracker').val('1');
      }
      else {
          panel.slideDown("500");
          $('#hidTracker').val('0');
      }

      return false;
  });


});

したがって、現在は次のように機能します。サイトの読み込み時に、パネル(引き出し)が閉じていることが表示されます。リンクをクリックしてパネルを表示/非表示にすると、すばらしい動作をします。ただし、ボタンの1つがポストバックを生成した後、パネルが更新され、ポストバックが生成されるたびにOPENと表示されます。ポストバック後も、開閉リンクを使用して開閉できますが、これはうまく機能しますが、ポストバック前のパネルの状態を保存し、ポストバック後の状態に設定する方法が必要です。

非表示フィールドで提供されるコードクラブバケットはそれでも機能するはずですが、機能しません。ポストバック後にパネルが開いているか閉じているかを確認する方法が必要だと思います。チェックはページの読み込み時にのみ行われ、ポストバック後は行われません!!!

4

2 に答える 2

1

状態の追跡は自分で行う必要があります。これには独自の非表示フィールドを使用しました。

<input type="hidden" ID="hidTracker" value="0" />

そしてあなたの関数の一番上に

if($('#hidTracker').val() == '1')
{
    $(".sokrij").show();
}
else
{
    $(".sokrij").hide(); 

}

次に、メイン関数本体を変更して状態を手動で追跡します

$("#fioka").find(".sokrij").each(function () 
{              
    if ($(this).is(":visible")) 
    {                 
       $(this).slideUp("500");    
       $('#hidTracker').val('0');          
    }         
});          

if ($(this).next().is(":hidden")) 
{             
   $(this).next().slideDown("500");        
   $('#hidTracker').val('1');          

} 

しかし

これは 1 つのパネルでのみ機能しますが、これはあなたのケースではありません。したがって、非表示にされているパネルの ID に状態をリンクするには、このプロセスをうまく処理する必要があります。

同じ原則を使用して以前にこれを行ったことがありますが、非表示フィールドに JSON 文字列を記録してから再水和すると、構造のキー/値情報を追加して状態を記録できます

非表示フィールドの JSON は、2 つのパネルで次のようになります。

{"panelState": [{ID:"pnl1", "State":"1"}, {ID:"pnl2", "State":"0"}]}

これは、文字列を構築して再水和するのに役立つjsonパーサーです。

それを実現するには少し手間がかかりますが、これが始まりです。時間があればもう少し肉付けしますが、約束はできません - 申し訳ありません

編集

1 つのパネルの試行に適応するには

var panel = $("#fioka").find(".sokrij");

if (panel.is(":visible"))      
{                         
    panel.slideUp("500");            
    $('#hidTracker').val('1');               
}  
else
{
    panel.slideDown("500");            
    $('#hidTracker').val('0');       
}

すべてのコードをラップすることを忘れないでください

$(document).ready(function(){

  //all my code

});

そうしないと、DOM のロードが保証されず、コードが正しく実行されない可能性があります

編集2

show hide code trackering javaScript を取得するのは困難ですが、この奇妙な関数は更新パネルにフックされ、更新パネルがポストバックしたときに起動します。これにより、更新パネルがパネルの状態を追跡できるようになります

 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) {

     if($('#hidTracker').val() == '1') 
     {     
         $(".sokrij").show(); 
     } 
     else 
     {     
         $(".sokrij").hide();   
     } 

});

それが役に立てば幸い

于 2012-02-07T13:16:54.880 に答える
0

したがって、何かを非表示にする場合は、次のようにします。

.sokrij
{
    display:none;
}

それを表示したいとき:

$(".sokrij").css("display","";

編集:あなたのニーズを誤解しました。情報を保存する必要がある場合は、セッション変数などを使用してください。

if(Session["state"] != null)
    string state = Session["state"].ToString();

if(state  == "0")
{
    $(".sokrij").hide();
}

if (state == "1") { $(".sokrij").hide(); Session["state"]="0"; } }

もちろん、文字列を整数やブール値などに変更できます。

于 2012-02-06T23:16:39.877 に答える