ASP.Net自定义控件
问题描述:
我正在开发一个自定义控件,需要将下拉列表显示为复合控件。ASP.Net自定义控件
从休息Web服务中填充下拉列表。我面临的问题是,下拉列表只有DataTextField和DataValueField,但我需要一种在控件中存储更多值的方法,即我需要访问所选项目的其他一些属性。
这样做的最好方法是什么?
这里是我到目前为止的代码:
[ValidationProperty("SelectedValue")]
public class SelectSurveyControl : Panel
{
private DropDownList ddlSurveys;
public string SelectedSurveyId
{
get
{
return SelectedValue;
}
}
public string SelectedSurveyJavascriptEmbedCode
{
get
{
return this.ddlSurveys.SelectedItem.Attributes[""];
}
}
public string SelectedValue
{
get
{
return ddlSurveys.SelectedValue;
}
set
{
if (ddlSurveys == null)
{
ddlSurveys = new DropDownList();
}
ddlSurveys.SelectedValue = value;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnInit(e);
if (ddlSurveys == null)
{
ddlSurveys = new DropDownList();
}
IList<Survey> surveys = GetSurveys();
this.ddlSurveys.DataSource = surveys;
this.ddlSurveys.DataTextField = "title";
this.ddlSurveys.DataValueField = "id";
this.ddlSurveys.DataBind();
ddlSurveys.SelectedValue = this.SelectedValue;
ddlSurveys.CssClass = "umbEditorTextFieldMultiple charlimit";
ddlSurveys.Attributes.Add("SurveyId", SelectedSurveyId);
ddlSurveys.Attributes.Add("JavascriptEmbedingCode", SelectedSurveyId);
this.Controls.Add(ddlSurveys);
}
public IList<Survey> GetSurveys()
{
...
}
}
答
尝试使用字符串连接/拆分来存储和检索的各个值,那么你不必很自定义您的下拉列表。
例如:
文字:有些题目
值:1 |测试试验| 2010/2/12
这将让你想你保存尽可能多的价值,所以只要你选择一个合适的角色加入和分裂。我通常使用酒吧,就像我上面的例子。
边注:我在看你选定的值集处理程序,它需要一些调整。你不应该检查一个空的下拉列表,而应该在每个get和set之前调用EnsureChildControls()来代替。确保你重写CreateChildControls()方法并在那里创建你的控件。
答
你可以使用一个隐藏字段和重复通这样返回的调查的副本:
foreach(Survey s in Surveys){
string val = s.id + ":" + s.<property1> + ":" + s.<property2>;
hiddenField.Value += val +",";
}
当你需要从隐藏字段读,你用String.Split的值分成数组使用','作为分隔符,在每个数组中,使用':'再次分割。
在第一次拆分Array1 [0]谁是调查ID和Array1 [n!= 0]将是ID = Array1 [0]的Survey的属性。 Array [n!= 0]然后将被分割成Array2。
我会建议使用空字符串或其他东西来处理空的属性值,否则,如果指定StringSplitOptions.RemoveEmptyEntries,则结果可能不相等。
Agricfowl
http://stackoverflow.com/questions/2001521/html-dropdown-selection-value可能会给你这个问题的出发点。 – DaveParsons 2011-01-26 11:40:50