2

RadTreeViewマスターページで使用します:

しかし、私は次の問題に直面しています:

ツリービューのノードをクリックすると選択が失われ、ノードをクリックするたび(Response.Redirect("..."))に、マスターが(!Page.IsPostback) 毎回入力され、ツリービューが再度バインドされるため、選択が失われます。

この問題を解決する方法。

私の .aspx :

 <telerik:RadTreeView ID="rtv_cm" runat="server" OnNodeExpand="rtv_cm_NodeExpand"
                OnNodeClick="rtv_cm_NodeClick" Skin="WebBlue">
 </telerik:RadTreeView>

私の .cs :

 protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["emp_num"] != null && !string.IsNullOrEmpty(Session["emp_num"].ToString()))
            {

                if (!Page.IsPostBack)
                {

                    LoadRootNodes(rtv_cm, TreeNodeExpandMode.ServerSide);
                }
            }
            else
            {
                Response.Redirect("Frm_login.aspx");
            }
        }

protected void rtv_cm_NodeClick(object sender, RadTreeNodeEventArgs e)
        {
            dt_childs = (DataTable)Session["dt_childs"];
            IEnumerable<DataRow> result = from myRow in dt_childs.AsEnumerable()
                                          where myRow.Field<string>("task_id").TrimEnd() == e.Node.Value.TrimEnd()
                                          select myRow;
            if (result != null)
            {
                if (!string.IsNullOrEmpty(result.ElementAtOrDefault(0).Field<string>("page_name")))
                {
                    Response.Redirect(result.ElementAtOrDefault(0).Field<string>("page_name").TrimEnd(), false);
                }
            }
        }

メニューの入手方法:

  private void LoadRootNodes(RadTreeView treeView, TreeNodeExpandMode expandMode)
        {
            dt = Menu_db.GetMenu(Session["emp_num"].ToString(), CMSession.Current.db_code);
            IEnumerable<DataRow> result = from myRow in dt.AsEnumerable()
                                          where myRow.Field<string>("task_id").TrimEnd() == "0"
                                          select myRow;
            if (result != null && result.Count()>0)
            {
                DataTable dt_roots = result.CopyToDataTable<DataRow>();
                Session["dt"] = dt;
                Session["dt_roots"] = dt_roots;

                foreach (DataRow row in dt_roots.Rows)
                {
                    RadTreeNode node = new RadTreeNode();

                    node.Text = row["task_name"].ToString().TrimEnd();
                    node.Value = row["task_id"].ToString().TrimEnd();
                    if (Convert.ToInt32(row["count"]) > 0)
                    {
                        node.ExpandMode = expandMode;
                    }
                    treeView.Nodes.Add(node);
                }
            }
        }
4

4 に答える 4

3

HTTP は、「ステートレス プロトコル」として知られているものです。基本的に、サーバーがアルツハイマー病の重度の症例を持っているかのようです (無礼を意図したものではありません)。サーバーはあなたの質問に答えますが、あなたがそこにいたことを忘れてしまいます.

HTTP が主に静的ドキュメントのフェッチに使用されていた場合、これは問題になりませんでしたが、Web アプリケーションには何らかの状態が必要でした。これを実現する方法は多数ありますが、ASP.NET は通常、"ViewState" を多用します。<input type="hidden">ビュー ステートは、 base-64 形式のバイト コードを含む単なるタグです。(レンダリングされた HTML ページのソースをブラウザーで表示すると、"__VIEWSTATE" という名前のページが表示されます)。ユーザーが (ボタンをクリックするなどして) フォームを再送信すると、viewstate データがサーバーに送り返されます。基本的には、サーバーが前回あなたに伝えたことを思い出させるようなものです。これは、TextBoxes と GridViews がポストバック間で状態を一見維持できる方法です。状態を「viewstate」に保存します。

ただし、ビューステートの問題は、簡単に失われる可能性があることです。フォームを送信する必要があります。そうしないと、viewstate は保持されません。アンカー タグまたは を使用するRequest.Redirectと、フォームを回避して Web ページにアクセスすることになり、その過程でビューステートをまったく渡しません。

多くの場合、これを回避する方法はないため、アプリケーションの状態を保存する別の方法があります。ただし、viewstate とは異なり、これは保持する値ごとに手動で行う必要があります。データを Cookie に保存したり、(Server["key"]またはを使用してSession["key"]) サーバーにデータを保存したり、データベースやテキスト ファイルなどのより具体的なものにデータを保存したりできます。ただし、これはすべて手動で行う必要があり、ページをリロードするときにデータをリロードする必要があります。

あなたの場合、現在のページに基づいてどのアイテムが選択されたかを推測し(ツリービューのアイテムとページがリンクされているように見えるため)、選択したアイテムを明示的に設定することができます。それが不可能な場合は、 のSessionようなものを使用して、選択した項目を に保存してみてくださいSession["Master_SelectedTreeViewItem"] = treeViewItem.Id;。次に、 でPage_Loadこの値を取得し (注意: である可能性がありますnull)、対応するツリービュー項目を選択済みとして設定します。

コード例をもっと投稿したいと思いますが、ツリービューなどをロードしているコードを提供していないため、実行するのは困難です。

詳細情報

ASP.NET 状態管理の概要 (MSDN)

于 2012-10-04T19:49:42.597 に答える
2

ツリーを他のページにリンクする URL にバインドする場合は、クエリ文字列を使用して選択を追加し、他のページのクエリ文字列からツリーの選択を読み込みます。

リダイレクト先の 2 番目のページが最初のページと同じ UI を持っていると思われる場合は、リダイレクトせずに、選択用の新しいコンテンツを同じページにロードしてください。これにより、コントロールがビュー ステートをサポートします。

于 2012-10-06T17:00:44.797 に答える
2

私が考えることができる唯一の方法は、選択をセッションに保存し、(!Page.IsPostBack)、そのセッションキーを探して、バインディング後に選択を更新することです。

あなたが直面している問題は、本質的に、リダイレクトを介して別の html ページに移動するため、ViewState がウィンドウの外にあるためです。同じアドレスであることを気にしないでください。

于 2012-10-02T10:44:02.583 に答える
1

私はすでにこの問題を抱えていました。まったく同じ問題で、TreeViewItemClickにリダイレクトする必要があります。

最後に選択したアイテムがセッションであると保存して解決し、ページの読み込み時に再度選択します。

このように考える

protected void rtv_cm_NodeClick(object sender, RadTreeNodeEventArgs e)
{
    Session["LastClickedNode"] = e.Node.Value;
    ...
}

Loadメソッドで、次のようにノードを選択する必要があることを確認します。

 private void LoadRootNodes(RadTreeView treeView, TreeNodeExpandMode expandMode)
 {
     //... your code
     if (Session["LastClickedNode"] !=null)
     {
          if (row["task_id"].ToString().TrimEnd() == Session["LastClickedNode"].ToString())
          {
               node.Selected = true;
          } 
     }
 }

これで問題は解決すると思います。

于 2012-10-11T13:06:36.553 に答える