【问题标题】:Checkbox in Repeater control in asp.net is not workingasp.net 中中继器控件中的复选框不起作用
【发布时间】:2014-09-26 19:52:37
【问题描述】:

我在Repeater 控件中有一个复选框列,即使我在第一次加载页面时只使用了一次绑定,它也不会保持状态。每次它返回 Checked=True 时,即使我取消选中它。这是代码。

这是 .aspx 代码

<asp:Repeater ID="rptCols" runat="server" onitemdatabound="rptCols_ItemDataBound" >     
   <HeaderTemplate>
      <table width="200px" border="1" id="tblRpt" style="background-color:White;border-color:#CCCCCC;border-width:1px;border-style:None;font-family:Arial;font-size:X-Small;width:180px;border-collapse:collapse;">
          <tr>
             <th>COLUMN</th>
             <th colspan="2">&nbsp;</th>
          </tr>
  </HeaderTemplate>
  <ItemTemplate>
      <tr runat="server" id="tblRow">
         <td><asp:Label id="lblCol" runat="server" Text= '<%# Eval("Col1")%>'></asp:Label> </td>        
         <td><asp:CheckBox id="chkSelect" runat="server" Checked= '<%# Convert.ToBoolean(Eval("Col2")) %>'/></td>
         <td style="visibility:hidden"><asp:Label ID ="lblHidCol" runat="server" Text='<%# Eval("Col3") %>' /></td>
     </tr>
  </ItemTemplate>
  <FooterTemplate>
      </table>
  </FooterTemplate>
</asp:Repeater>

这是背后的 aspx.cs 代码

protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        if (!Page.IsPostBack)
        {
            FillColsGrid(false); //Binding only once..
        }

    }
    catch (Exception ex)
    {
        this.lblException.Text = ex.Message.ToString() ;
    }
}

我想使用此按钮事件获取复选框的当前状态,该事件不起作用,在第一次加载页面时返回相同的状态:

protected void wibHideShow_Click(object sender, EventArgs e)
{
    List<UserSettings> lstColsGrid = new List<UserSettings>();

    string sUser = Session["UserId"].ToString();
    foreach (RepeaterItem item in rptCols.Items)
    {
        if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
        {
            UserSettings us = new UserSettings();
            Label lblColName = item.FindControl("lblCol") as Label;
            CheckBox chkSel = item.FindControl("chkSelect") as CheckBox; //Here is the issue
            Label hidAppName = item.FindControl("lblHidCol") as Label;

            us.BemsId = sUser;
            us.ApplicationName = hidAppName.Text;
            us.ColumnName = lblColName.Text;
            us.ColumnValue = chkSel.Checked.ToString();
            us.LastUpdateDate = System.DateTime.Now;
            lstColsGrid.Add(us);
        }
    }
    rptCols.DataSource = LoadColsDataSet(lstColsGrid);
    rptCols.DataBind();

}

有人可以帮忙吗?

【问题讨论】:

  • 删除了我的其他答案,因为问题出在其他地方,我怀疑这可能是因为您的转发器在回发时重新绑定。尝试从中继器中的复选框中删除 Eval,只是为了测试,然后查看当您选中和取消选中时是否可以从复选框中获得正确的状态。您可以在代码隐藏中绑定 OnItemDataBound 中的值,而不是使用 Eval
  • 我从 rptCols_ItemDataBound 事件中删除了 Eval 并为每个字段分配了值。问题保持不变。当我取消选中并进行回发时,当我遍历按钮单击事件中的每个项目时,该值不会反映在回发中。
  • 您是否尝试过中断并单步执行回发/页面加载并检查当时您的转发器的值?您还可以检查 Request.Form 以查看实际发布到服务器的内容 - 通过浏览器工具或 page_init/pageload。
  • 是的,也尝试过 Request.Form,没有运气。
  • 并且正确的值实际上是在表单对象中发送到服务器的吗?

标签: c# asp.net checkbox


【解决方案1】:

这就是我解决这个问题的方法:

这是 ASPX 页面中的中继器:

<div style="overflow: auto;height:140px" id="DivMainContent">  
  <asp:Repeater ID="rptCols" runat="server" OnItemDataBound="rptCols_ItemDataBound"> 
     <HeaderTemplate>
         <table id="tblRpt" style="background-color:White;border-color:#CCCCCC;border-width:1px;border-style:None;font-family:Arial;font-size:X-Small;width:180px;border-collapse:collapse;">
            <tr class="GridHeader" style="height:15px;">
                <th>COLUMN</th>
                <th colspan="2"></th>
            </tr>
     </HeaderTemplate>
     <ItemTemplate>
        <tr runat="server" id="tblRow">
           <td><asp:Label id="lblCol" runat="server"></asp:Label> </td>
           <td><asp:CheckBox id="chkSelect" runat="server"/></td>
           <td style="display:none"><asp:Label ID ="lblHidCol" runat="server"/></td>
        </tr>
     </ItemTemplate>
     <FooterTemplate>
        </table>
     </FooterTemplate>
  </asp:Repeater>
</div>
<div id="DivFooterRow" style="overflow: hidden; display: none;">
     <input type="hidden" id="hidChk" runat="server" />
</div>
<br />
<asp:Button ID="wibHideShow" Font-Names="Arial" Font-Size="XX-Small" runat="server"
     ToolTip="Save Columns to Hide or Show" Text="Hide/Show" OnClick="wibHideShow_Click"  />
<br />

在页面的最后,写下这个jquery。

<script type="text/javascript">
function showValues() {
    var str = $("#DivMainContent :input").serialize();
    $("#hidChk").val(str); //hidden field
}
$("input[type='checkbox']").on("click", showValues);
showValues();

ASPX.CS 代码

int iChk = 1;
protected void Page_Load(object sender, EventArgs e)
{
    try
    {
        if (!Page.IsPostBack)
        {
             this.rptCols.DataSource = LoadColsDataSet(); //load data from database
             this.rptCols.DataBind();
        }
    }
    catch (Exception ex)
    {
        //display error in some label
    }
}
protected void rptCols_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    try
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataRowView drv = (DataRowView)e.Item.DataItem;
            Label lblCol = e.Item.FindControl("lblCol") as Label;
            CheckBox chkCol = e.Item.FindControl("chkSelect") as CheckBox;
            Label lblHidc = e.Item.FindControl("lblHidCol") as Label;

            lblCol.Text = drv.Row["DBCol1"].ToString();
            chkCol.Checked = Convert.ToBoolean(drv.Row["DBCol2"].ToString());
            lblHidc.Text = drv.Row["DBCol3"].ToString();
        }
    }
    catch (Exception ex)
    {
        this.lblException.Text = ex.Message.ToString();
    }
}

protected void wibHideShow_Click(object sender, EventArgs e)
{
    List<UserSettings> lstColsGrid = new List<UserSettings>();
    iChk = 0;
    string sUser = Session["BEMSID"].ToString();
    ArrayList ar = GetChecked();
    foreach (RepeaterItem item in rptCols.Items)
    {
        UserSettings us = new UserSettings();
        Label lblColName = item.FindControl("lblCol") as Label;
        Label hidAppName = item.FindControl("lblHidCol") as Label;

         us.BemsId = sUser;
         us.ApplicationName = hidAppName.Text;
         us.ColumnName = lblColName.Text;
         us.ColumnValue = ar[iChk].ToString();
         us.LastUpdateDate = System.DateTime.Now;
         iChk++;
         lstColsGrid.Add(us);
     }
     rptCols.DataSource = LoadColsDataSet(lstColsGrid); //Update and load data
     rptCols.DataBind();
     iChk = 1;
 }

    private ArrayList GetChecked()
    {
        ArrayList ar = new ArrayList();
        int chkNo = 0;
        string strChkNo = string.Empty;
        string[] strChk = hidChk.Value.Split('&');

        //initialize array with all false
        for (int i = 0; i < rptCols.Items.Count; i++)
        {
            ar.Add("false");
        }
        for (int i = 0; i < strChk.Length; i++)
        {
            strChkNo = strChk[i].Replace("%3A", ":");
            if (strChkNo != "")
            {
                chkNo = Convert.ToInt16(Regex.Match(strChkNo, @"\d+").Value); //Extract int from string
                ar[--chkNo] = "true";
            }
        }

        return ar;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多