我正在查询填充gridview的数据库,并在数据视图'onrowdatabound'中的每个单元格中添加下拉框,以便在填充gridview时填充这些DDL。
我希望能够单击一个按钮从这些DDL获取值,但是当单击按钮时发生回发并且所有DDL都消失并且它为我提供了DDL的默认值。
我认为他们消失了,因为他们没有被调用页面加载(我似乎无法做,因为他们被称为onrowdatabound)
<asp:GridView id="View" name="Spview" onrowdatabound="populateCellswithDDls" runat="server"></asp:GridView>
在内部'populateCellswithDDls'函数中添加ddl循环每个单元格:
e.Row.Cells[i].Controls.Add(DDL1);
接下来我玩的是ViewState和Sessions,用于在回发时保存下拉列表(尝试在'populateCellswithDDls'函数中创建会话,如下所示:
DropDownList DDL1 = new DropDownList();
//I've tried newSkillsMon.AutoPostBack = true; but this just removes them all too
Session.Add("ViewState", View);
Session.Add("DropdownState", DDL1);
我已经尝试过各种各样的方法来处理viewstate和session但不确定在哪里使用它们来保存'onrowdatabound'种群的状态。
我的按钮目前看起来像这样:
protected void confirm_Click(object sender, EventArgs e){
{foreach (GridViewRow row in View.Rows)
// if (DDL1.SelectedItem.Value != "Select Item"){
if (IsPostBack)
{
Debug.WriteLine(DDL1.SelectedValue);
}
这只给了我X量的“选择项目”而不是我在DDL中选择的内容
我缺少什么,我会在哪里添加这些会话以保持onrowdatabound创建的ddl?
由于
答案 0 :(得分:0)
可能对你有用而不是尝试会话的东西是使用hiddenfields。 为每个下拉列表位置创建一个隐藏字段,然后使用javascript用下拉值填充隐藏字段。 (可能希望在提交时进行一些服务器端验证)
使用jQuery这样的东西:
$(".dropdowns").on("change", function () {
$(this).closest('input:hidden').val($(this).val());
});
并在您的确认中:
if (HF_HiddenField1.Value != "Select Item")
答案 1 :(得分:0)
创建动态控件时,需要在每个Page Load上重新创建它们并包含PostBack。首先,将GridView数据绑定到IsPostBack
检查之外。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//normally you would bind here
}
//but now bind grid every page load
GridView1.DataSource = Common.LoadFromDB();
GridView1.DataBind();
}
现在在RowDataBound事件中确保DropDownList具有ID
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
//check if the row is a datarow
if (e.Row.RowType == DataControlRowType.DataRow)
{
//create a dropdownlist and assign an ID
DropDownList DDL1 = new DropDownList();
DDL1.ID = "DDL1";
//add some dummy listitems
DDL1.Items.Insert(0, new ListItem() { Text = "A", Value = "A" });
DDL1.Items.Insert(1, new ListItem() { Text = "B", Value = "B" });
DDL1.Items.Insert(2, new ListItem() { Text = "C", Value = "C" });
//add the control to the row
e.Row.Cells[0].Controls.Add(DDL1);
}
}
现在,您可以通过点击按钮从正确的行中获取值。
protected void Button1_Click(object sender, EventArgs e)
{
//find the dropdownlist in the correct row and cast it back to one
DropDownList DDL1 = GridView1.Rows[i].FindControl("DDL1") as DropDownList;
//display the result
Label1.Text = DDL1.SelectedValue;
}