3

我有一个调用方法的ListViewwith 。EditItemTemplateonItemEditing

在我的范围内,我ListView有一个CheckBoxList使用LINQ.

在我的onItemEditing方法中,我试图确定CheckBoxes它们是否存在于将用户与部门链接的查找表中。

但是,当我加载时,即使我已在方法中将它们设置为选中,也不会检查EditItemTemplate任何一个。CheckBoxesonItemEditing

这是方法:

protected void onItemEditing(object sender, ListViewEditEventArgs e)
{
    ListView1.EditIndex = e.NewEditIndex;
    ListView1.DataBind();

    int regId = Convert.ToInt32(((Label)ListView1.Items[e.NewEditIndex].FindControl("LblRegId")).Text);
    CheckBoxList cbl = (CheckBoxList) ListView1.Items[e.NewEditIndex].FindControl("chkLstSectors");

//test to see if forcing first check box to be selected works - doesn't work
    cbl.Items[0].Selected = true;

    SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DaresburyConnectionString"].ToString());
    SqlCommand objCmd = new SqlCommand("select * from register_sectors where register_id= " + regId, objConn);
    objConn.Open();

    SqlDataReader objReader = objCmd.ExecuteReader();

    if (objReader != null)
    {
        while (objReader.Read())
        {
            ListItem currentCheckBox = cbl.Items.FindByValue(objReader["sector_id"].ToString());
            if (currentCheckBox != null)
            {
                currentCheckBox.Selected = true;
            }
        }
    }
}

任何想法如何解决这个问题?

4

2 回答 2

1

问题是在绑定 checkboxlist 后 listView 再次被绑定。

我删除了绑定,它有效!

于 2009-07-31T10:06:37.170 回答
0

我希望我的回答不会太晚;)

我在 ListView 中有一个 CheckBoxList,它应该像其他控件一样 DataBind。数据库中的值是从此枚举中计算得出的值:

public enum SiteType
{
    Owner = 1,
    Reseller = 2,
    SubReseller = 4,
    Distributor = 8
    Manufacturer = 16,
    Consumer = 32
}

如果值为 24,则表示分销商和制造商 (8 + 16)。

我在 ListView 的 EditItem 中添加了一个 HiddenField,用于对值进行数据绑定:

<EditItemTemplate>
    <tr>
        <td>
            <asp:CheckBoxList ID="cblSiteTypes" runat="server" RepeatLayout="Flow"
                DataSourceID="ObjectDataSource4" DataTextField="Key" DataValueField="Value" />
            <asp:HiddenField ID="hfSiteTypes" runat="server" Value='<%# Bind("SiteType") %>' OnDataBinding="hfSiteTypesBnd" />
        </td>
    </tr>
    <!-- other data... -->
</EditItemTemplate>

CheckBoxList 通过另一个 DataSource 填充,该 DataSource 返回一个 Dictionary 对象,其中包含来自枚举的数据。在后面的代码中,我使用 HiddenField 的 OnDataBinding 方法进行选择:

protected void hfSiteTypesBnd( object sender, EventArgs e )
{
    // read the value
    HiddenField hf = (HiddenField)sender;
    short val = Convert.ToInt16( hf.Value );
    // find the checkboxlist
    CheckBoxList cblSiteTypes = (CheckBoxList)hf.Parent.FindControl( "cblSiteTypes" );
    // clear the selection (may be not needed)
    cblSiteTypes.ClearSelection();
    // for each item
    foreach ( ListItem li in cblSiteTypes.Items )
    {
        // get the value from each item and...
        short v = Convert.ToInt16( li.Value );
        // ...look up whether this value is matching or not
        if ( ( val & v ) == v ) li.Selected = true;
    }
}

瞧!

于 2014-09-11T13:24:10.650 回答