【问题标题】:html table binding issuehtml表格绑定问题
【发布时间】:2011-12-07 23:34:11
【问题描述】:

我有一个使用以下代码动态绑定表的函数。我在页面加载中调用此函数。调用此方法后,表格包含三列:复选框、标签和文本框。

我还有一个按钮控件。单击此按钮时,我正在检查表中的选中复选框,然后将数据插入与选中复选框对应的数据库中。

问题是当按钮被点击时它没有存储复选框的选中状态,因为按钮点击也会调用页面加载,它调用下面的函数,因此表中的所有元素都被重新创建。

我不能在此处使用 Page.IsPostBack,因为单击按钮时应该加载表格。如果我在 if(!Page.IsPostBack) 中编写以下代码,那么在单击按钮时,它不会在表中找到任何行

try
{
    ManageVIN objMngVin = new ManageVIN();
    DataTable tblVins = objMngVin.MyFunction(clientCode);
    if (tblAssociateFleet.Rows.Count > 1)
    {
        for (int i = 1; i <= tblAssociateFleet.Rows.Count - 1; i++)
        {
            tblAssociateFleet.Rows[i].Cells.Clear();
        }
    }
    if (tblVins != null && tblVins.Rows.Count > 0)
    {
        foreach (DataRow dr in tblVins.Rows)
        {
            HtmlTableRow tblRow = new HtmlTableRow();
            tblRow.Attributes.Add("class", "tblrow");
            HtmlTableCell tblCell1 = new HtmlTableCell();
            CheckBox chk = new CheckBox();
            chk.CssClass = "selctChk";
            if (!Page.IsPostBack)
            {
                chk.Checked = false;
            }
            tblCell1.Controls.Add(chk);
            HtmlTableCell tableCelll2 = new HtmlTableCell();
            Label lblVinVlaue = new Label();
            lblVinVlaue.Text = Convert.ToString(dr["VIN"]);
            tableCelll2.Controls.Add(lblVinVlaue);
            HtmlTableCell tableCell3 = new HtmlTableCell();
            TextBox txtVinVal = new TextBox();
            txtVinVal.CssClass = "textEntry";
            tableCell3.Controls.Add(txtVinVal);
            tblRow.Cells.Add(tblCell1);
            tblRow.Cells.Add(tableCelll2);
            tblRow.Cells.Add(tableCell3);
            tblAssociateFleet.Rows.Add(tblRow);
        }
    }
}

我该如何处理这个问题?

【问题讨论】:

    标签: c# asp.net html-table


    【解决方案1】:

    您应该在 Init 或 PreInit 生命周期中执行此操作。根据 MS,PreInit 是首选位置。如果您take a look at the ASP.NET page life cycle 加载有点太晚了(特别是缺少处理复选框单击的回发数据的 IPostBackDataHandler.LoadPostData)。

    另外,这与to this stack overflow question 类似。

    【讨论】:

    • 从 preinit 调用函数时它第一次工作正常,但现在我还有一个下拉菜单 OnSelectedIndexChange 我正在调用相同的函数问题是在更改下拉列表中的值并单击按钮后下拉选择的索引在函数中更改为默认值。
    【解决方案2】:

    听起来你的做法非常接近正确。

    但是,我发现了一个问题。您有一个块说明:

    if (!Page.IsPostBack)
    {
      chk.Checked = false;
    }
    

    完全删除该块。问题是在回发 asp.net 上实际上呈现了两次页面。在第一次渲染时,该行正在杀死复选框的状态。

    我知道 Hexxagonal 说过要在生命周期的 init 或 preinit 部分执行此操作,但是,我们有很多页面可以动态生成控件。对于那些我们总是在 page_load 中处理生成并且它工作得很好。

    【讨论】:

    • 即使删除该块后,结果也是一样的
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多