質問を表示するために使用するアプリケーションを開発しています。これはListView
、 のさまざまなテーブルのオプションDataBase
です。
一度に 1 つの質問のみが表示されるように割り当てPageSize="1"
ましDataPager
た。オプションを選択した後、[次へ] ボタンをクリックすると別の質問が表示されますが、[前へ] ボタンをクリックするListView
と、前に選択したオプションが表示されませんか? 最後に送信する必要があるため、前に選択したオプションを保持する方法がわかりませんDataBase
。
質問する
1530 次
2 に答える
0
このようなシーンリオの値を保持するには、Sessionオブジェクトを使用します。次のような値のコレクションを作成できます-質問ID、回答IDなど。セッションに保存します(HashTableが適切なオプションです)。ユーザーが戻ったら、その質問IDの値をセッションから取得します。ユーザーが次の質問に移動するたびにSessionオブジェクトを更新します。ただし、次のような状況に対処することを忘れないでください。ユーザーが戻って次に移動すると、質問IDはすでに収集されています。
于 2013-01-15T08:44:19.553 に答える
0
コントロールの値を に保存できHashtable
ますSession
。TextBox
以下は、 の 2 つのコントロールとCheckBox
for 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 に答える