我有一个GridView,每行都有一个DropDownList。 (DropDownList中的项目对于每个项目都是相同的。)我在GridView之外有一个DropDownList“ddlView”,用于过滤其他DropDownLists中的可用选项。 ddlView的默认选择是无过滤器。
当用户为ddlView选择新值时,如果其他DropDownLists中的任何选定值在应用过滤器后不是其中一个值,则会消失。在这种情况下我想要发生的是先前选择的值仍然存在并被选中。
实现这一目标的最佳方法是什么?
以前选择的值在回发期间可用,但在GridView上调用DataBind()后似乎会被清除,因此我无法在填充它们的方法中确定它们之前的值(RowDataBound事件)。
到目前为止,我最好的想法是在回发期间手动将该信息存储到对象或集合中,并在数据绑定事件期间稍后引用它。
有更好的方法吗?
答案 0 :(得分:1)
我认为没有更好的方法来实现这一点,因为GridView绑定时会重新创建所有控件,从而删除选择。
以下工作原理:(我将选择存储在postback上,以便在RowDataBound事件中再次检索)
<强>标记强>
<asp:Button ID="button1" runat="server" Text="Post Back" OnClick="button1_Click" />
<br />
<asp:GridView ID="gridView1" runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:DropDownList ID="gridViewDropDownList" runat="server">
<asp:ListItem Value="1">Item 1</asp:ListItem>
<asp:ListItem Value="2">Item 2</asp:ListItem>
<asp:ListItem Value="3">Item 3</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<强>代码强>
public class GridViewDropDownSelections
{
public int RowIndex { get; set; }
public int SelectedIndex { get; set; }
}
...
private List<GridViewDropDownSelections> selectedDropDownListItems = new List<GridViewDropDownSelections>();
protected override void OnLoad(EventArgs e)
{
var selections = gridView1.Rows.Cast<GridViewRow>().Where(r => r.RowType == DataControlRowType.DataRow)
.Select(r => new GridViewDropDownSelections() { RowIndex = r.RowIndex, SelectedIndex = ((DropDownList)r.FindControl("gridViewDropDownList")).SelectedIndex }).ToList();
selectedDropDownListItems.AddRange(selections);
gridView1.RowDataBound += new GridViewRowEventHandler(gridView1_RowDataBound);
if (!IsPostBack)
{
BindDataGrid();
}
base.OnLoad(e);
}
protected void button1_Click(object sender, EventArgs e)
{
BindDataGrid();
}
private void BindDataGrid()
{
//Dummy data
string[] data = new string[] { "Item 1", "Item 2", "Item 3" };
gridView1.DataSource = data;
gridView1.DataBind();
}
void gridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var selection = selectedDropDownListItems.FirstOrDefault(i => i.RowIndex == e.Row.RowIndex);
if (selection != null)
{
try
{
DropDownList gridViewDropDownList = (DropDownList)e.Row.FindControl("gridViewDropDownList");
gridViewDropDownList.SelectedIndex = selection.SelectedIndex;
}
catch (Exception)
{
}
}
}
}
希望它有所帮助。
答案 1 :(得分:0)
当选择另一个过滤器时,您可以通过Items
property添加/删除DropdownList项,而不是使用DataBinding来应用过滤器。这样,不应重置下拉列表中的选定值。
答案 2 :(得分:0)
您可以通过简单的条件完成此操作。我不知道你是如何过滤这些物品的,但它会是这样的:
for (int itemIndex = 0; itemIndex < DropDownList1.Items.Count; itemIndex++)
{
ListItem item = DropDownList1.Items[itemIndex];
if (DropDownList1.Items.IndexOf(item) > ddlView.SelectedIndex)
{
if (!item.Selected)
{
DropDownList1.Items.Remove(item);
}
}
}
不确定这是否是您正在寻找的,但希望它有所帮助。
答案 3 :(得分:0)
使用客户端javascript
搜索所有相应的选择输入,找到每个输入,查看选项并删除在主ddl中选择的输入
function UpdateDropDowns (tbl) {
var controls = tbl.getElementsByTagName('select');
for (var i = 0; i < controls.length; i++) {
RemoveOption(controls[i], 'the value to remove');
}
}
function RemoveOption(ddl, val)
{
for (var i = ddl.options.length; i>=0; i--) {
if (ddl.options[i].value == val) {
ddl.remove(i);
}
}
}