我在(Asp.Net3.5)页面上显示了一个DataList,用户可以从中选择。然后,所选行的datakey值将存储在数据库中。
如果同一用户在将来的某个时间点重新访问该页面,则从DB中检索所选的datakey值。我想使用此datakey值突出显示DataList中的相应行。
如何从此DataKey值设置DataList的相应SelectedIndex?
我尝试了以下内容;
protected void dlCampChars_DataBinding(object sender, EventArgs e)
{
for (int i = 0; i < dlCampChars.Items.Count; i++)
{
// Ignore values that cannot be cast as integer.
try
{
if (dlCampChars.DataKeys[i].ToString() == lSelection.ToString())
{
Label28.Text = i + "";
dlCampChars.SelectedIndex = i + 1;
}
}
catch { }
}
}
如果我在ItemDataBinding中设置它,则在DL绑定后生成SelectedIndex更新并且无效。任何想法??
由于
更新代码
// if stored DataKey exists loop through DataTable
// looking for the index of the item matching the DataKey
int itemIndex = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
// check the appropriate "DataKey" column name of the current row
if (dt.Rows[i]["cha_Key"].ToString() == lSelection)
{
// match found, set index and break out of loop
itemIndex = i;
break;
}
}
答案 0 :(得分:2)
看起来DataList中的东西有点倒退,具体取决于项目的呈现时间以及它所在的模板(请参阅下面的第一个链接以获得解释)。 ItemDataBound方法是有效的,但有时候有点古怪,如该文章所述。在您描述的情况下,我相信第二种方法可行,您可以在调用DataBind()之前设置SelectedIndex属性。步骤是:
以下是一个例子:
void Page_Load(Object sender, EventArgs e)
{
// Load sample data only once, when the page is first loaded.
if (!IsPostBack)
{
dlCampChars.DataSource = CreateDataSource();
dlCampChars.DataBind();
}
}
private DataTable CreateDataSource()
{
// however you get your data and whatever the resulting object is
// for example: DataTable, DataView, etc.
DataTable dt = [relevant code here];
// retrieve the user's stored DataKey
string datakey = [retrieved datakey value from DB];
// if stored DataKey exists loop through DataTable
// looking for the index of the item matching the DataKey
int itemIndex = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
// check the appropriate "DataKey" column name of the current row
if (dt.Rows[i]["DataKey"].ToString() == datakey)
{
// match found, set index and break out of loop
itemIndex = i;
break;
}
}
// set SelectedIndex
dlCampChars.SelectedIndex = itemIndex;
// now return the DataSource (ie. DataTable etc.)
return dt;
}
您可能会发现这些文章很有用:
编辑:为循环代码添加了DataTable。无论你的实际数据源对象是什么,这个想法都是一样的。