2013-09-27 26 views
1

我有DetailsView自動選擇數據源中的數據。在detailsview中,我有2個從不同數據源綁定的下拉列表。在更新時,我希望每個下拉列表的文本和值存儲到數據庫中。ASP .NET更新命令不同的SQL數據源

我似乎無法獲得下拉列表的值,所以我可以在SQL命令執行前更新參數。或者,如果有另一種方式可以做到這一點,那就太好了。

<asp:DetailsView ID="UserProfile" runat="server" 
    AutoGenerateRows="False" DataKeyNames="UserId" DefaultMode="Edit" 
    DataSourceID="UserProfileDataSource" onitemupdated="UserProfile_ItemUpdated" OnPageIndexChanging="UserProfile_PageIndexChanging"> 
    <Fields> 
      <asp:BoundField DataField="fname" HeaderText="First Name:" 
       SortExpression="fname" /> 
     <asp:BoundField DataField="lname" HeaderText="Last Name:" 
       SortExpression="lname" /> 
     <asp:BoundField DataField="address" HeaderText="Address:" 
       SortExpression="address" /> 
     <asp:BoundField DataField="city" HeaderText="City:" 
       SortExpression="city" /> 
      <asp:TemplateField HeaderText="State:" SortExpression="state"> 
       <EditItemTemplate> 
        <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource1" DataTextField="State_en" DataValueField="StateId"> 
        </asp:DropDownList> 
       </EditItemTemplate> 
       <InsertItemTemplate> 
        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("state") %>'></asp:TextBox> 
       </InsertItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("state") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
     <asp:BoundField DataField="zip" HeaderText="Zip Code:" 
       SortExpression="zip" /> 
     <asp:BoundField DataField="phoneNum" HeaderText="Phone Number:" 
       SortExpression="phoneNum" /> 
      <asp:TemplateField HeaderText="Auto Carrier:" SortExpression="autoCarrier"> 
       <EditItemTemplate> 
        <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource2" DataTextField="Name" DataValueField="CarrerID"> 
        </asp:DropDownList> 
       </EditItemTemplate> 
       <InsertItemTemplate> 
        <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("autoCarrier") %>'></asp:TextBox> 
       </InsertItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="Label2" runat="server" Text='<%# Bind("autoCarrier") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:BoundField DataField="policyNum" HeaderText="Policy Number:" 
       SortExpression="policyNum" /> 
        <asp:CommandField ShowEditButton="True" /> 
    </Fields> 
</asp:DetailsView> 
<asp:SqlDataSource ID="UserProfileDataSource" runat="server" 
      ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" 
      SelectCommand="SELECT [fname], [lname], [address], [city], [state], [zip], [phoneNum], [autoCarrier], [policyNum], [accountid] ,[UserId] FROM [UserProfile] WHERE ([UserId] = @UserId)" 
    OnSelecting="UserProfileDataSource_Selecting" 
    OnUpdating="OnSqlUpdating" 
    UpdateCommand="UPDATE UserProfile SET 
    stateId = @stateId, 
    carrierId = @carrierId, 
    fname = @fname, 
    lname= @lname, 
    address = @address, 
    city = @city, 
    state = @state, 
    zip = @zip, 
    phoneNum = @phoneNum, 
    autoCarrier = @autoCarrier, 
    policyNum = @policyNum 
    WHERE ([UserId] = @UserId)"> 
    <SelectParameters> 
      <asp:Parameter Name="UserId" Type="Object" /> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="fname" /> 
     <asp:Parameter Name="lname" /> 
     <asp:Parameter Name="address" /> 
     <asp:Parameter Name="city" /> 
     <asp:Parameter Name="state" /> 
     <asp:Parameter Name="zip" /> 
     <asp:Parameter Name="phoneNum" /> 
     <asp:Parameter Name="autoCarrier" /> 
     <asp:Parameter Name="policyNum" /> 
     <asp:Parameter Name="stateId" /> 
     <asp:Parameter Name="carrierId" /> 
     <asp:Parameter Name="UserId" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" SelectCommand="SELECT [StateId], [State_en] FROM [States]"></asp:SqlDataSource> 
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" 
     SelectCommand="SELECT [CarrerID], [Name] FROM ### WHERE ([AccountID] = (SELECT [accountid] FROM ### WHERE ([UserId] = @UserId)))" OnSelecting="UserProfileDataSource_Selecting"> 
    <SelectParameters> 
      <asp:Parameter Name="UserId" Type="Object" /> 
    </SelectParameters> 
    </asp:SqlDataSource> 

這裏的後面,我寫的代碼,但不工作:

protected void OnSqlUpdating(object sender, SqlDataSourceCommandEventArgs e) 
{ 

    string state = DropDownList1.SelectedItem.Text; 
    string autoCarrier = DropDownList2.SelectedItem.Text; 
    string stateId = DropDownList1.SelectedItem.Value; 
    string carrierId = DropDownList2.SelectedItem.Value; 

    e.Command.Parameters["@state"].Value = state; 
    e.Command.Parameters["@autoCarrier"].Value = autoCarrier; 
    e.Command.Parameters["@stateId"].Value = stateId; 
    e.Command.Parameters["@carrierId"].Value = carrierId; 
} 

我不斷收到:

錯誤99「DropDownList1」這個名字不會在目前情況下存在 錯誤102名稱'DropDownList1'在當前上下文中不存在
錯誤101名稱'DropDownList2'在當前上下文中不存在
Erro r 103在當前上下文中不存在名稱'DropDownList2'

我是新來的ASP,因此任何建議您推薦或清理錯誤的代碼實踐,我們將不勝感激。

回答

2

您無法直接訪問DropDownList1DropDownList2,因爲DetailsView控件有TemplateField。數據綁定後,您可以使用:

DropDownList1 myDropDownList =(DropDownList)UserProfile..Rows[0].Cells[0].FindControl("DropDownList1"); 
string state = myDropDownList .SelectedItem.Text; 

用於傳遞您需要使用OnUpdating事件的參數。

<asp:SqlDataSource ID="UserProfileDataSource" runat="server" 

OnUpdating="UserProfileDataSource_Updating" 

      ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" 
      SelectCommand="SELECT [fname], [lname], [address], [city], [state], [zip], [phoneNum], [autoCarrier], [policyNum], [accountid] ,[UserId] FROM [UserProfile] WHERE ([UserId] = @UserId)" 
    OnSelecting="UserProfileDataSource_Selecting" 
    OnUpdating="OnSqlUpdating" 
    UpdateCommand="UPDATE UserProfile SET 
    stateId = @stateId, 
    carrierId = @carrierId, 
    fname = @fname, 
    lname= @lname, 
    address = @address, 
    city = @city, 
    state = @state, 
    zip = @zip, 
    phoneNum = @phoneNum, 
    autoCarrier = @autoCarrier, 
    policyNum = @policyNum 
    WHERE ([UserId] = @UserId)"> 
    <SelectParameters> 
      <asp:Parameter Name="UserId" Type="Object" /> 
    </SelectParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="fname" /> 
     <asp:Parameter Name="lname" /> 
     <asp:Parameter Name="address" /> 
     <asp:Parameter Name="city" /> 
     <asp:Parameter Name="state" /> 
     <asp:Parameter Name="zip" /> 
     <asp:Parameter Name="phoneNum" /> 
     <asp:Parameter Name="autoCarrier" /> 
     <asp:Parameter Name="policyNum" /> 
     <asp:Parameter Name="stateId" /> 
     <asp:Parameter Name="carrierId" /> 
     <asp:Parameter Name="UserId" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" SelectCommand="SELECT [StateId], [State_en] FROM [States]"></asp:SqlDataSource> 
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" 
     SelectCommand="SELECT [CarrerID], [Name] FROM ### WHERE ([AccountID] = (SELECT [accountid] FROM ### WHERE ([UserId] = @UserId)))" OnSelecting="UserProfileDataSource_Selecting"> 
    <SelectParameters> 
      <asp:Parameter Name="UserId" Type="Object" /> 
    </SelectParameters> 
    </asp:SqlDataSource> 

然後在後面

protected void UserProfileDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e) 
      { 
       e.Command.Parameters["@ParamaterName"].Value = // The Value you get from the drop   downlist 
      } 
+0

感謝穆罕默德代碼。明天我會試試這個。要清楚,但我已經有一個onUpdating調用。我可以使用它,對嗎?還有關於如何將值分配給頁面加載下拉列表的任何見解? – Saf

+0

你的意思是你想添加項目到頁面加載下拉列表? – user123456

+0

不,我想將用戶選擇onUpdating的項目設置爲顯示的默認值。目前列表中的第一項始終顯示。 – Saf