2015-09-10 114 views
0

我在detailsview控件中有一個下拉列表。數據源是一個含有一個月日的列的SQL表。ASP如何在detailsview中綁定下拉列表的選定值

<asp:TemplateField HeaderText="Day of Month: "> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlDoM" runat="server" > 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:TextBox ID="TextBox6" runat="server" Text='<%# Bind("dayofthemonth") %>'></asp:TextBox> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label7" runat="server" Text='<%# Bind("dayofthemonth") %>'></asp:Label> 
      </ItemTemplate> 
      <HeaderStyle Font-Bold="True" /> 
</asp:TemplateField> 

我在DataBound事件中填充了數字1 - 31的下拉列表。

protected void DataView1_DataBound(object sender, EventArgs e) 
{ 
    DropDownList ddlDoM = (DropDownList)Page.FindControl("ctl00$formPlaceHolder$DataView1$ddlDoM"); 
    if (DataView1.CurrentMode == DetailsViewMode.Edit) 
    { 
     for (int i = 1; i < 32; i++) 
     { 
      ListItem item = ListItem.FromString(i.ToString()); 
      ddlDoM.Items.Add(item); 
     } 
    } 
     DataRowView drv = DataView1.DataItem as DataRowView; 
     ddlDoM.SelectedIndex = ddlDoM.Items.IndexOf(ddlDoM.Items.FindByValue(drv["dayofthemonth"].ToString())); 
    } 
} 

在這裏的最後一行中,我將下拉列表的選定值設置爲當前數據源值。

ddlDoM.SelectedIndex = ddlDoM.Items.IndexOf(ddlDoM.Items.FindByValue(drv["dayofthemonth"].ToString()));

我如何可以將綁定在下拉列表來更新數據源中的值發生變化的時候?我已嘗試將所選值屬性設置爲<%# Bind("dayofthemonth") %>,但我收到一個OutOfRangeException。我假設列表尚未填入切換到編輯模式。

對此有何看法?讓我知道你是否需要更多的代碼。

+1

這有什麼好使用經典的ASP - 請重新標記爲ASP.NET。 – Paul

+0

我的錯誤,感謝捕獲 –

回答

0

嘗試在您的數據源中爲您的UpdateParameters添加ControlParameter,並確保您的下拉列表設置爲AutoPostBack(如果適用)。您也可以考慮在之前的事件中填入下拉列表(例如Page_Init),並保留其默認值,直到您已擁有DataBound事件。

<asp:SqlDataSource ... UpdateCommand=""....> 
    <UpdateParameters> 
     <asp:ControlParameter ControlID="ddlDoM" Name="dayofthemonth" PropertyName="SelectedValue" Type="Int32" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 

而且,如果它仍然造成的問題,安全的(但詳細)選項是直接添加listItems中的下拉列表控制,因爲他們似乎是靜態值:

<asp:DropDownList ID="ddlDoM" runat="server" AutoPostBack="true"> 
    <asp:ListItem Value="1" /> 
    <asp:ListItem Value="2" /> 
    <asp:ListItem Value="3" /> 
    etc... 
</asp:DropDownList> 
+0

我遵循這些步驟,現在我在ControlParameter'dayofthemon'中得到錯誤'無法找到控件'ddlDoM'。 '這可能是因爲控件不存在,除非DetailsView處於編輯模式?我怎樣才能解決這個問題? –

+0

@NickOban:對不起,我原來的代碼更關心選擇參數,但是您正在尋找更新參數。查看更新的答案。 –

+0

再次感謝邁克爾。這絕對是更接近,但現在我回到OutOfRangeException。 ''ddlDoM'有一個無效的SelectedValue,因爲它不存在於項目列表中。 參數名稱:值'我認爲這可能是一個生命週期問題。我需要知道是否有事件在ddlDoM的數據綁定之前觸發,但在創建之後(切換到編輯模式時)。現在我將繼續使用詳細的ListItem解決方案。 –