【问题标题】:checkboxlist databinding to an entity framework table复选框列表数据绑定到实体框架表
【发布时间】:2012-08-23 13:54:34
【问题描述】:

我在 formview 对象中放置了一个复选框列表。 我想将复选框列表的结果存储并加载到实体框架的表中。

我使用 DataSourceID、DataTextField 和 DataValueField 属性为 cbl 填充了来自具有 2 列的表的值和标签,但我似乎找不到如何将 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>

【问题讨论】:

  • @AmiramKorach 我只添加了代码的相关部分。谢谢。

标签: c# asp.net visual-studio-2010 entity-framework


【解决方案1】:
<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
}

【讨论】:

  • 感谢 Amiram,但我正在寻找更通用的东西。我正在使用这一行来更新实体:formView1.UpdateItem(true);并希望将 cbl 绑定到 emp 对象(就像我使用文本框和 Text='' 属性,使用 bind 或 eval)
  • 绑定是将单个值绑定到字段(可能多次像在网格中一样)。我认为这不适合这里。也许你可以用一个非常复杂的机制来做到这一点。我认为这不值得付出努力。
  • 假设我有一个包含 100 种产品的清单,我想知道哪个员工知道如何使用哪种产品。我可以在员工表中添加 100 列,每个产品 1 列,并为每个员工 (Y,N) 和每个产品存储一个布尔值。问题是,如果有新产品到货,我需要添加另一列(BAD IDEA)。相反,我希望有 3 个表 - 员工、产品和员工产品。我已经根据这个模型构建了 EDM,现在我正在寻找正确更新它。手动更新员工产品表的每一行会太慢而且容易出错......
  • 您的数据设计很好,但在这里使用CheckBoxList 可能不是一个好主意。当您的项目很少而不是 100 时,这很好。您也可以通过仅将员工产品放在表中来实现这一点,为每一行添加一个删除按钮,并在插入模板中为产品放置一个具有自动完成功能的文本框名称,或打开一个弹出窗口以从单独的列表中添加产品。
  • 感谢您的建议,但您能否详细说明此解决方案,因为我对 ASP.net 编程还很陌生。您会为桌子推荐哪个对象以及如何设计它?我认为下拉框更适合选择产品。无论如何,我对 100 有点夸张。它更像是 15-20,所以如果可能的话,仍然首选使用 cbl 的解决方案(这也是客户的愿望......)
【解决方案2】:

您需要执行以下操作;

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;
}

请根据需要修改查询和参数。

【讨论】:

  • 嗨 .Net Dreamer,感谢您的回答,但请查看我对 Amiram 的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2018-01-03
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多