DetailsView中的Eval / Binding DropDownList

时间:2012-08-23 14:39:26

标签: c# asp.net data-binding detailsview

我在详细信息视图中有一个下拉列表,它从一个表中获取其值并将所选值绑定到另一个表。我遇到的问题是,每当回发发生时,我获取ddl值的表将更改回默认读取。这使得所选的值始终更改为null(这是列表的第一个值)

我尝试过把!IsPostBack放在page_load中:

   if (!IsPostBack)
   {
        DetailsView1.DataBind();
   }

我确实有第二个ddl依赖于第一个列表但是一个正常工作,它是第一个始终为null并且不会保持所选值的列表。

这是第一个ddl:

  <asp:DropDownList ID="DropDownList1" runat="server" AppendDataBoundItems="True" 
    AutoPostBack="True" DataSourceID="SQLLEAVECODE" DataTextField="LEAVETYPE" 
    DataValueField="LEAVECODE" Height="18px" style="text-transform:uppercase;"
    onselectedindexchanged="DropDownList1_SelectedIndexChanged"
    SelectedValue='<%# bind("reqleavecode") %>' Width="145px">
    <asp:ListItem></asp:ListItem>
  </asp:DropDownList>

我似乎无法弄清楚这一点,我认为这可能与我的绑定有关。

    public string lvtype;
    public string lvrequest;

    private DataSet GetData()
    {
        ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;

        var sql = "SELECT LEAVETYPE, LEAVECODE FROM TESTBWTIME.BWLVTYPE ORDER BY LEAVECODE";

        using (iDB2Connection conn = new iDB2Connection(GetConnectionString()))
        {
            conn.Open();

            using (iDB2Command cmd = new iDB2Command(sql, conn))
            {
                cmd.DeriveParameters();

                using (iDB2DataAdapter da = new iDB2DataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    da.Fill(ds);

                    return ds;
                }
            }
        }
    }

    private String GetConnectionString()
    {
        ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;

        return cssc["connStringNET"].ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        DropDownList ddl1 = (DropDownList)(DetailsView1.FindControl("DropDownList6"));
        DropDownList ddl2 = (DropDownList)(DetailsView1.FindControl("DropDownList5"));
        DataSet ds = GetData();
        if (!Page.IsPostBack)
        {
            ddl1.DataSource = ds;
            ddl1.DataBind();
            lvtype = ddl1.SelectedValue;

            ddl2.DataSource = ds;
            ddl2.DataBind();
            lvrequest = ddl2.SelectedValue;
        }
        else
        {
            lvtype = ddl1.SelectedValue;
            lvrequest = ddl2.SelectedValue;
        }
       }

1 个答案:

答案 0 :(得分:0)

我讨厌同样的问题,我使用以下技术解决它。请根据您的需要修改此代码。基本上,你需要在顶级i-e全局的两个变量。然后,您可以在Postback中获取选定的dropdownlist值,并选择索引更改的事件,如下所示;

public string vendorId;
public string categoryId;

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        dropDownListVendor.DataSource = CatalogAccess.GetVendors();
        dropDownListVendor.DataBind();
        vendorId = dropDownListVendor.SelectedValue;

        dropDownListCategory.DataSource = CatalogAccess.GetCategoriesInVendor(vendorId);
        dropDownListCategory.DataBind();
        categoryId = dropDownListCategory.SelectedValue;
    }
    else
    {
        vendorId = dropDownListVendor.SelectedValue;
        categoryId = dropDownListCategory.SelectedValue;
    }
}

protected void dropDownListVendor_SelectedIndexChanged(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        dropDownListCategory.DataSource = CatalogAccess.GetCategoriesInVendor(vendorId);
        dropDownListCategory.DataBind();
    }
}