问题描述
我有一个 radiobuttonList,它有三个选项,值为 1、2、3,用户不能取消选择。我添加了一些 jquery 来检查/取消选中选择,但它无法正常工作。 根据代码,新的 radiolist 控件被创建,无论它在 DB 中有什么值,它都会选择它并使该选择 = true。现在,当我切换选中/取消选中并保存页面重新加载并再次调用 createchildcontrol 并设置来自 db 的先前值并且 selectedvalue 显示为 prev 值时,它没有将 selectedvalue 显示为 null。
控件代码如下
using System;
using System.Collections.Generic;
namespace Web.UI.WebControls
{
using System.Drawing;
using System.Linq;
using System.Web.UI.WebControls;
using System.Web.UI;
using Web.UI.Interfaces;
/// <summary>
/// This server control provides a list of radio buttons.
/// </summary>
public class SaicOtherSpecRadioButtonList : SaicCustomControlBase,IDataControl
{
/// <summary>
/// Label for Radio buttons - Yes,No.
/// </summary>
protected Label MyLabel;
public IList<ILookupItem> ListItems = new List<ILookupItem>();
/// <summary>
/// Instruction for this control Item
/// </summary>
protected Label MyInstructionLabel;
/// <summary>
/// Other Label (usually it is "Other")
/// </summary>
protected Label MySpecifyLabel;
/// <summary>
/// Specify Text Box
/// </summary>
protected TextBox MyOtherSpecTextBox;
protected LiteralControl Brk;
/// <summary>
/// Radio button list Yes,No
/// </summary>
protected RadioButtonList MyRadioList; //instantiate here so that object will be created to add validation on.
/// <summary>
/// Validator Indicator -- "←"
/// </summary>
protected Label MyValidatorIndicator = new Label();
/// <summary>
/// Validator Indicator -- "←"
/// </summary>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
this.Page.Validators.Add(this);
}
/// <summary>
/// SaicRadio: Label + SpecifyLabel + Other TextBox + RadioButtonList
/// </summary>
protected override void CreateChildControls()
{
Controls.Clear();
var rdId = MainControlId;
OtherSpecTextBoxId = NamePrefix + ControlItem.Dash + 1 + PartialId;
// add a Yes/No RadioButtonList
MyRadioList = new RadioButtonList
{
ID = rdId,RepeatDirection = RepeatDirection.Horizontal,RepeatLayout = RepeatLayout.Flow,EnableViewState = true,RepeatColumns = 3
};
MyRadioList.DataValueField = "ItemValue";
MyRadioList.DataTextField = "ItemName";
MyRadioList.DataSource = ListItems;
MyRadioList.DataBind();
if (!String.IsNullOrEmpty(base.Text))
{
MyRadioList.Items.FindByValue(base.Text).Selected = true;
}
else
{
MyRadioList.SelectedValue = null;
}
for (var i = 0; i < ListItems.Count; i++)
{
MyRadioList.Items[i].Attributes.Add("title",ListItems[i].ItemName);
}
Controls.Add(MyRadioList);
// add a place holder to put the validation indicator
Controls.Add(this.MyValidatorIndicator);
MyValidatorIndicator.CssClass = "ValidatorIndicator";
// the Label object with AssociatedControlID set creates the HTML <label> tag
MyLabel = new Label
{
EnableViewState = true,Text = this.Title,CssClass = "OtherLabel_" + MainControlId,AssociatedControlID = rdId
};
Controls.Add(MyLabel);
MySpecifyLabel = new Label
{
EnableViewState = false,Text = string.IsNullOrEmpty(DecoText) ? this.Title : DecoText,// (Deco Text is set in the database) DM
// (DecoText didn't seem to be set anywhere,label should say specify.)
//Text = " - Specify: ",AssociatedControlID = OtherSpecTextBoxId,CssClass = string.IsNullOrEmpty(DecoText) ? "HiddenLabel" : "SpecifyLabel_" + MainControlId
};
Controls.Add(MySpecifyLabel);
// add other spec textBox
MyOtherSpecTextBox = new TextBox
{
ID = OtherSpecTextBoxId,Text = base.OtherText,Width = OtherSpecTextBoxWidth,MaxLength = 210,CssClass = "SpecifyDescBox_" + MainControlId,//Enabled = !string.IsNullOrEmpty(base.OtherText)
};
Controls.Add(MyOtherSpecTextBox);
// add a break
if (!string.IsNullOrEmpty(Instruction))
{
MyInstructionLabel = new Label
{
EnableViewState = false,Text = Instruction,CssClass = "instruction noBold displayBlock clearFloat"
};
Controls.Add(MyInstructionLabel);
}
Brk = new LiteralControl { Text = "<br/>" };
Controls.Add(Brk);
}
protected override void RenderContents(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterattribute.Class,"OtherSpecLabel");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
MyLabel.RenderControl(writer);
if (ListItems[0].LookupGroup == "OrgType")
{
Brk.RenderControl(writer);
}
MySpecifyLabel.RenderControl(writer);
MyOtherSpecTextBox.RenderControl(writer);
writer.RenderEndTag();
MyRadioList.RenderControl(writer);
MyValidatorIndicator.RenderControl(writer);
if (MyInstructionLabel != null)
{
MyInstructionLabel.RenderControl(writer);
}
}
/// <summary>
/// A value that indicates if the checkBox is checked. "True" if checked,"False" if not,NULL if not selected.
/// The Get property is used at post back processing time for data saving.
/// </summary>
public override string Text
{
get
{
return (MyRadioList != null)
? (MyRadioList.SelectedValue.Equals(string.Empty) ? null : MyRadioList.SelectedValue)
: base.Text;
}
}
public override string OtherText
{
get
{
if (MyOtherSpecTextBox == null)
{
return base.OtherText;
}
if (string.IsNullOrEmpty(MyOtherSpecTextBox.Text.Trim()))
{
return null;
}
return MyOtherSpecTextBox.Text.Trim();
}
}
private bool InternalCheck(ISaicValidator validator)
{
bool retVal = true;
if (!MyRadioList.SelectedValue.Equals(string.Empty) && MyOtherSpecTextBox.Text.Trim().Length <= 0)
{
retVal = false;
ErrorMessage = validator.GetAnchoredErrorMessage(MyOtherSpecTextBox.ClientID) + " Please specify if it is checked.";
}
else if (MyRadioList.SelectedValue.Equals(string.Empty) && MyOtherSpecTextBox.Text.Trim().Length > 0)
{
retVal = false;
ErrorMessage = validator.GetAnchoredErrorMessage(MyRadioList.ClientID) + " Please check if it is specified.";
}
return retVal;
}
protected override bool EvaluateIsValid()
{
var retVal = true;
if (MyRadioList == null)
{
return retVal;
}
ErrorMessage = string.Empty;
if (Validators != null)
{
foreach (var validator in Validators)
{
switch (validator.ValidationType)
{
case ValidationType.required:
if (!IsFormComplete)
retVal = true;
else
{
validator.Validate(MyRadioList.Text);
retVal = validator.IsValid;
ErrorMessage = !retVal ? validator.ErrorMessage : "";
ErrorMessage = validator.GetAnchoredErrorMessage(MyRadioList.ClientID);
}
break;
case ValidationType.Internal:
retVal = InternalCheck(validator);
break;
}
}
}
MyValidatorIndicator.Text = retVal ? "" : ValidatorIndicator;
return retVal;
}
}
}
$("input:radio[id*='OtherRdList-0_" + partialId + "']").click(function () {
if (checkstate) {
$("input:radio[id*='OtherRdList-0_" + partialId + "']").removeAttr("checked");
checkstate = $("input:radio[id*='OtherRdList-0_" + partialId + "']").is(":checked");
}
else if (!checkstate) {
$("input:radio[id*='OtherRdList-0_" + partialId + "']").prop("checked",true);
checkstate = $("input:radio[id*='OtherRdList-0_" + partialId + "']").is(":checked");
}
});
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)