0

質問を表示するために使用するアプリケーションを開発しています。これはListView、 のさまざまなテーブルのオプションDataBaseです。
一度に 1 つの質問のみが表示されるように割り当てPageSize="1"ましDataPagerた。オプションを選択した後、[次へ] ボタンをクリックすると別の質問が表示されますが、[前へ] ボタンをクリックするListViewと、前に選択したオプションが表示されませんか? 最後に送信する必要があるため、前に選択したオプションを保持する方法がわかりませんDataBase

4

2 に答える 2

0

このようなシーンリオの値を保持するには、Sessionオブジェクトを使用します。次のような値のコレクションを作成できます-質問ID、回答IDなど。セッションに保存します(HashTableが適切なオプションです)。ユーザーが戻ったら、その質問IDの値をセッションから取得します。ユーザーが次の質問に移動するたびにSessionオブジェクトを更新します。ただし、次のような状況に対処することを忘れないでください。ユーザーが戻って次に移動すると、質問IDはすでに収集されています。

于 2013-01-15T08:44:19.553 に答える
0

コントロールの値を に保存できHashtableますSessionTextBox以下は、 の 2 つのコントロールとCheckBoxfor each itemをレンダリングするサンプル ページListViewです。状態は、ページング イベント間で保持されます。

WebForm1.aspxページ:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication13.WebForm1" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ListView runat="server" ID="listView" EnableViewState="true" OnItemDataBound="listView_ItemDataBound" ClientIDMode="Inherit">

                <ItemTemplate>
                    <div class="Product">
                        <strong>
                            <asp:TextBox runat="server" ID="TextBoxId" OnTextChanged="TextBox_TextChanged"></asp:TextBox>
                            ::
                            <asp:TextBox runat="server" ID="TextBoxName" OnTextChanged="TextBox_TextChanged"></asp:TextBox>
                        </strong>
                        <br />
                        <asp:CheckBox runat="server" ID="CheckBoxChecked" AutoPostBack="true" OnCheckedChanged="CheckBoxChecked_CheckedChanged" />
                    </div>
                </ItemTemplate>
                <LayoutTemplate>
                    <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
                </LayoutTemplate>
                <ItemSeparatorTemplate>
                    <hr />
                </ItemSeparatorTemplate>
            </asp:ListView>

            <asp:DataPager ID="DataPagerProducts" runat="server" PagedControlID="listView"
                PageSize="1" OnPreRender="DataPagerProducts_PreRender">
                <Fields>
                    <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
                    <asp:NumericPagerField />
                    <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
                </Fields>
            </asp:DataPager>
        </div>
    </form>
</body>
</html>

コード ビハインド ファイル - WebForm1.aspx.cs:

using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication13
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        /// <summary>
        /// This object will preserve the values of the controls
        /// </summary>
        internal Hashtable DataObject
        {
            get
            {
                if (Session["DataObject"] == null)
                    Session["DataObject"] = new Hashtable();
                return (Hashtable)Session["DataObject"];
            }
            set
            {
                Session["DataObject"] = value;
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
                BindData();
        }

        private void BindData()
        {
            listView.DataSource = new[] { 
                    new{Id=1,Name="test 1",Checked=true},
                    new{Id=2,Name="test 2",Checked=true},
                    new{Id=3,Name="test 3",Checked=true}
                };
            listView.DataBind();
        }

        protected void DataPagerProducts_PreRender(object sender, EventArgs e)
        {
            BindData();
        }

        /// <summary>
        /// Use the ItemDataBound event to set the values of the controls
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void listView_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            SetValue("TextBoxId", "Id", e);
            SetValue("TextBoxName", "Name", e);
            SetValue("CheckBoxChecked", "Checked", e);
        }

        /// <summary>
        /// Sets the value of the control with the specified id by looking in the user session's DataObject hashtable
        /// </summary>
        /// <param name="id">The id of the searched control</param>
        /// <param name="dataProperty">The property name of the data item</param>
        /// <param name="e">The list view item event arguments</param>
        void SetValue(string id, string dataProperty, ListViewItemEventArgs e)
        {
            if (e.Item.DataItem == null)
                return;
            var webControl = e.Item.FindControl(id);
            switch (webControl.GetType().ToString())
            {
                //To do: handle other control types, such as System.Web.UI.WebControls.ComboBox etc.
                case "System.Web.UI.WebControls.TextBox":
                    var label = (TextBox)webControl;
                    if (DataObject[label.ClientID + e.Item.DataItemIndex.ToString()] == null)
                    {
                        DataObject[label.ClientID + e.Item.DataItemIndex.ToString()] = e.Item.DataItem.GetType().GetProperty(dataProperty).GetValue(e.Item.DataItem);
                    }
                    label.Text = String.Format("{0}", DataObject[label.ClientID + e.Item.DataItemIndex.ToString()]);
                    break;
                case "System.Web.UI.WebControls.CheckBox":
                    var checkBox = (CheckBox)webControl;
                    if (DataObject[checkBox.ClientID + e.Item.DataItemIndex.ToString()] == null)
                    {
                        DataObject[checkBox.ClientID + e.Item.DataItemIndex.ToString()] = e.Item.DataItem.GetType().GetProperty(dataProperty).GetValue(e.Item.DataItem);
                    }
                    checkBox.Checked = (bool)DataObject[checkBox.ClientID + e.Item.DataItemIndex.ToString()];
                    break;
                default:
                    break;
            }
        }

        protected void CheckBoxChecked_CheckedChanged(object sender, EventArgs e)
        {
            var checkBox = (CheckBox)sender;
            DataObject[checkBox.ClientID + (((ListViewDataItem)((Control)sender).Parent)).DataItemIndex] = checkBox.Checked;
        }

        protected void TextBox_TextChanged(object sender, EventArgs e)
        {
            var textBox = (TextBox)sender;
            DataObject[textBox.ClientID + (((ListViewDataItem)((Control)sender).Parent)).DataItemIndex] = textBox.Text;
        }
    }
}
于 2013-01-15T10:41:57.590 に答える