在回发时下拉列表重新填充/重置的问题

时间:2014-04-02 22:42:36

标签: c# asp.net postback pageload

我有一个网站,用户转到标签添加制造商。然后,他们移动到另一个选项卡以添加模型。在此模型选项卡上,他们通过文本框输入模型编号,然后从下面的下拉列表中选择制造商。也可以输入描述(文本框)。

制造商ddl填充在Page_Load上(如果我在此处不这样做,那么当从“制造商”选项卡添加新的制造商时,它将不会显示在“模型”选项卡上的“制造商”ddl中)。这是填充ddl的代码:

private void PopulateListControls()
        {
            Dictionary<int, string> manufactuerers = ManufacturerAdapter.GetAllDictionary();

            ddlManufacturer.DataSource = manufactuerers;
            ddlManufacturer.DataTextField = "Value";
            ddlManufacturer.DataValueField = "Key";
            ddlManufacturer.DataBind();
        }

这是发生填充的Page_Load:

protected void Page_Load(object sender, EventArgs e)

        {
            PopulateListControls();
        }

我遇到的问题是,当用户点击“保存”按钮时,制造商ddl正在保存列表中的第一个项目,而不是选中的项目(因为单击该按钮会导致另一个PostBack?)。模型编号(文本框条目)与描述一样保存。

如果我尝试将populate写成!IsPostBack检查(参见下面的示例),它解决了这个问题,但后来我遇到了用户无法在制造商选项卡中看到他们添加的制造商的问题。

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack)
    { 
        PopulateListControls();
    }
}

我可以采取不同的方法来解决这个问题吗?


编辑:04/01/2013 19:36


按钮保存代码:

以下是按钮开火:

protected void btnSave_Click(object sender, EventArgs e)
        {
            Save();
        }

Save()运行:

    public bool Save()
    {
        bool bIsSaved = false;

        if (!ValidateForm())
        {
            return false;
        }

        PopulateObjectsFromForm();
        _manufacturerModel = ManufacturerModelAdapter.Save(_manufacturerModel, _currentUser); 

        if (_manufacturerModel.ManufacturerModelId != 0)
        {
            bIsSaved = true;
         }
        else
        { //problem occurred
            RaisePageNotificationEvent(new PageNotification(PageNotificationType.Error, "Model Number could not be saved"));
            return false;
        }

        if (bIsSaved)
        {
            RaiseActionEvent("Save");
            RaisePageNotificationEvent(new PageNotification(PageNotificationType.Generic, String.Format("Model Number Saved: {0}", _manufacturerModel.ModelNumber)));            }

        ClearForm(); 

        return bIsSaved;
    }

编辑#2:04/012/2014 19:55


PopulateObjectsFromForm代码:

private void PopulateObjectsFromForm()
        {
            ManufacturerModel m = new ManufacturerModel();

            m.ManufacturerModelId = _manufacturerModel.ManufacturerModelId; // get from persisted object

            m.Manufacturer = ManufacturerAdapter.GetById(Convert.ToInt32(this.ddlManufacturer.SelectedValue));
            m.ModelNumber = this.txtModelNumber.Text;
            m.Description = this.txtDescription.Text;

            _manufacturerModel = m; // set persisted object to new object, values

        }

1 个答案:

答案 0 :(得分:0)

终于解决了这个问题。我在AutoPostBack中将ddlManufacturer控件的HTML属性设置为true:

<asp:DropDownList ID="ddlManufacturer" runat="server" CssClass="form-data" AutoPostBack="True">

并更改Page_Load以从ddl(填充列表控件)之前的Instantiate()中获取所选值

protected void Page_Load(object sender, EventArgs e)
{
    if (this.IsPostBack)
        this.ddlManufacturer.SelectedValue = Request.Form[ddlManufacturer.UniqueID];
    {
        Instantiate();
    }
}