5つのグリッドがあるページがあります。各グリッドの最初のフィールドはテンプレート内です。ページの読み込み時に、ポストバックでない場合は、データベースからの戻りに基づいてこのチェックボックスをオンにします。
ユーザーがチェックボックスをオフにした場合、このcheckeboxed.checked=falseはポストバックで保持されません。興味深いことに、ユーザーがチェックされていないチェックボックスをオンにすると、その変更はポストバックに反映されます。修正方法について誰か提案があれば教えてください。ありがとうございました!
<asp:GridView ID="commonAdultClinicReferrals" CssClass="Report" runat="server" AutoGenerateColumns="false"
Width="270" AllowPaging="false" AlternatingRowStyle-CssClass="DataAlternateRow"
CellPadding="1" CellSpacing="1" HeaderStyle-HorizontalAlign="Center" EmptyDataText="No Results."
DataKeyNames="Id,Name,Description,FollowUpList" OnRowDataBound="GridView_RowDataBound">
<Columns>
<asp:TemplateField ItemStyle-Width="10">
<ItemTemplate>
<center>
<asp:CheckBox ID="selectedRowCb" runat="server" />
</center>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Name" HeaderText="Common Adult Clinic Referrals" ItemStyle-Width="250"
ItemStyle-Wrap="true" />
</Columns>
</asp:GridView>
クラス:
public class FollowUp
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool FollowUpList { get; set; }
public bool Selected { get; set; }
public FollowUp(int id, string name, string description, bool followUpList, bool selected)
{
this.Id = id;
this.Name = name;
this.Description = description;
this.FollowUpList = followUpList;
this.Selected = selected;
}
}
DataBind:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
hdnWindowClose.Value = string.Empty;
loadUi();
}
}
private void loadUi()
{
_adultServices = GetFollowUps(2, true);
adultClinicReferrals.DataSource = _adultServices;
adultClinicReferrals.DataBind();
}
チェックボックスをオンに設定:
protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow && !Page.IsPostBack)
{
CheckBox cb = ((CheckBox)e.Row.FindControl("selectedRowCb"));
FollowUp fol = (FollowUp)e.Row.DataItem;
bool selected = fol.Selected;
cb.Checked = selected;
}
}
保存時:
protected void saveButton_Click(object sender, EventArgs e)
{
GetSelectedCodes(followUpAppointments);
GetSelectedCodes(adultClinicReferrals);
GetSelectedCodes(commonAdultClinicReferrals);
GetSelectedCodes(otherAdultClinicReferrals);
GetSelectedCodes(pediClinicReferrals);
hdnWindowClose.Value = "yes";
JavaScriptSerializer js = new JavaScriptSerializer();
string str = js.Serialize(_selectedServices);
hdnFollowUp.Value = str;
SetNotePickCodes();
}
最後に、GetSelectedCodes()内で、checkbox.check状態は、そのチェックボックスがデフォルトでtrueに設定されている場合は機能しません。
private void GetSelectedCodes(GridView gv)
{
for (int i = 0; i < gv.Rows.Count; i++)
{
GridViewRow row = gv.Rows[i];
bool isChecked = ((CheckBox)row.FindControl("selectedRowCb")).Checked;
if (isChecked)
{
int id = (Int32)gv.DataKeys[i]["Id"];
string name = gv.DataKeys[i]["Name"].ToString();
string description = gv.DataKeys[i]["Description"].ToString();
bool followup = (bool)gv.DataKeys[i]["FollowUpList"];
_selectedServices.Add(new FollowUp(id,name,description,followup,true));
}
}
if(isChecked)ブランチが実行されているのに、予期しないときに実行されています。たとえば、ユーザーがチェックボックスをオフにした場合です。私のデータバインドは、page.postbackでない場合、ページの読み込み時にのみ実行されます。
助けてくれてありがとう。
ありがとうございました、
ジェイ