2012-08-23 29 views
0

我已經在formview對象中放置了一個checkboxlist。 我想將複選框列表的結果存儲並加載到實體框架的表中。checkboxlist數據綁定到實體框架表

我使用DataSourceID,DataTextField和DataValueField屬性填充了來自具有2列表的值和標籤的cbl,但我似乎無法找到如何將cbl綁定到實體框架對象以便當窗體視圖處於「編輯」模式時,存儲選中的值。

任何幫助將不勝感激。謝謝!

<asp:FormView ID="formView1" runat="server" DataSourceID="Ods1" 
     Height="203px" Width="495px" 
     onpageindexchanging="formView1_PageIndexChanging"> 
<EditItemTemplate> 
    <asp:CheckBoxList ID="cblProducts" runat="server" RepeatColumns="3" 
       Width="782px" DataSourceID="SqlDataSource1" DataTextField="ProductName" 
       DataValueField="ProductCode"> 
    </asp:CheckBoxList> 
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
       ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" 
       SelectCommand="SELECT [ProductCode], [ProductName] FROM [Products]"> 
    </asp:SqlDataSource> 
</EditItemTemplate> 
</asp:FormView> 
    <asp:ObjectDataSource ID="Ods1" runat="server" 
     DataObjectTypeName="WebApplication1.EDM.Emp" DeleteMethod="DeleteEmp" 
     InsertMethod="CreateNewEmp" OldValuesParameterFormatString="original_{0}" 
     SelectMethod="GetEmpByEmpId" TypeName="WebApplication1.EDM.EmpLogic" 
     UpdateMethod="UpdateEmp" OnSelecting="Ods1_Selecting"> 
     <SelectParameters> 
      <asp:RouteParameter Name="EmpId" RouteKey="EmpId" Type="String" /> 
     </SelectParameters> 
    </asp:ObjectDataSource> 
+1

請加你的代碼 –

+0

@AmiramKorach我只添加了代碼的相關部分。謝謝。 – Urik

回答

0
<asp:FormView ID="formView1" runat="server" 
    OnItemUpdating="formView1_ItemUpdating" ...> 

protected void formView1_ItemUpdating(object sender, FormViewUpdateEventArgs e) 
{ 
    var cblProducts = formView1.FindControl("cblProducts") as CheckBoxList; 

    foreach (ListItem item in cblProducts.Items) 
    { 
     if (item.Selected) 
     { 
      // Check if item.Value is not in the db for this employee, if so add it 
     } 
     else 
     { 
      // Check if item.Value is in the db for this employee, if so delete it 
     } 
    } 

    // save 
} 
+0

謝謝Amiram,但我正在尋找更通用的東西。我正在使用這一行來更新實體:formView1.UpdateItem(true);並正在尋找綁定cbl到emp對象(就像我對文本框和Text ='<%#Bind(「number」,「{0:N}」)%>'屬性,使用bind或eval) – Urik

+0

綁定就是將一個單獨的值綁定到一個字段上(可能會像在網格中那樣多次)。我認爲這不適合這裏。也許你可以用一個非常複雜的機制來做到這一點。我認爲這不值得。 –

+0

假設我有一個100種產品的清單,我想知道哪位員工知道如何使用哪種產品。我可以在employees表中添加100列,每個產品添加1列,併爲每個員工(Y,N)和每個產品存儲一個布爾值。問題在於,如果有新產品到達,我需要添加另一列(BAD IDEA)。相反,我期望擁有3張桌子 - 員工,產品和員工 - 產品。我已經根據這個模型構建了EDM,現在我正在尋找正確的更新。手動更新員工產品表的每一行都會太慢並且容易出錯...... – Urik

0

你需要做以下;

foreach (ListItem chk in cblProducts.Items) 
{ 
    string productId= chk.Value; 
    if (IsProductAvailable(productId) // this method will basically goes to database and return true of false 
     chk.Selected = true; 
    else 
     chk.Selected = false; 
} 


private void IsProductAvailable(string productId) 
{ 
     string query = "SELECT [ProductId] FROM [Product] "; 
     query += "WHERE [ProductId] = @ProductId"; 
     DbCommand comm = new DbCommand(); 
     comm.CommandText = query; 

     DbParameter param = comm.CreateParameter(); 
     param.ParameterName = "@ProductId"; 
     param.Value = productId; 
     comm.Parameters.Add(param); 

     DataTable table = comm.ExecuteCommand(); 
     if (table.Rows.Count > 0) 
     { 
      return true; 
     } 
     else 
      return false; 
} 

請根據您的需要修改查詢和參數。

+0

嗨網絡夢想家,感謝您的答案,但請檢查我對Amiram的評論。 – Urik