在GridView中使用CheckBox而不是Edit

时间:2012-10-11 13:21:36

标签: c# asp.net gridview

我试图批量编辑和更新我的GridView。 我在CheckBox的第一列中生成了GridView。它的工作原理如下: 如果我检查GridView中的特定行,则该行可编辑。 像这样我可以检查我要编辑GridView的行数。 我在编辑了所有行后给出了一个名为UPDATE的通用按钮,然后单击此按钮,GridView在每行中更新循环,检查CheckBox.Check。

我在这里遇到的问题是,当我点击CheckBox行中的任何GridView时,我没有收到TextBox。 我在检查Label中的TextBox时尝试将CheckBox转换为GridView

因此,当我检查一行时,根据我的程序,该单元格的Label模板对应的文本将不可见,但无法获得具有该单元格值的TextBox

我尝试的代码是:

protected void OnCheckedChanged(object sender, EventArgs e)
    {
        bool isUpdateVisible = false;
        CheckBox chk = (sender as CheckBox);
        if (chk.ID == "chkAll")
        {
            foreach (GridViewRow row in GridView3.Rows)
            {
                if (row.RowType == DataControlRowType.DataRow)
                {
                    row.Cells[0].Controls.OfType<CheckBox>().FirstOrDefault().Checked = chk.Checked;
                }
            }
        }
        CheckBox chkAll = (GridView3.HeaderRow.FindControl("chkAll") as CheckBox);
        chkAll.Checked = true;
        foreach (GridViewRow row in GridView3.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                bool isChecked = row.Cells[0].Controls.OfType<CheckBox>().FirstOrDefault().Checked;
                for (int i = 3; i < row.Cells.Count; i++)
                {
                    row.Cells[i].Controls.OfType<Label>().FirstOrDefault().Visible = !isChecked;
                    if (row.Cells[i].Controls.OfType<TextBox>().ToList().Count > 0)//this condition is not satisfying when I debug the program. what is wrong in this line?
                    {
                        row.Cells[i].Controls.OfType<TextBox>().FirstOrDefault().Visible = isChecked;
                    }
                    if (isChecked && !isUpdateVisible)
                    {
                        isUpdateVisible = true;
                    }
                    if (!isChecked)
                    {
                        chkAll.Checked = false;
                    }
                }
            }
        }
        UpdateGrid.Visible = isUpdateVisible;
    }

aspx代码是:

<asp:GridView ID="GridView3" runat="server" AutoGenerateColumns="False"
DataKeyNames="Location_Profile_Name">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="chkAll" runat="server" AutoPostBack="true" OnCheckedChanged="OnCheckedChanged" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="OnCheckedChanged" />
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Location_Profile_Name" SortExpression="Location_Profile_Name">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Location_Profile_Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Home_Profile" SortExpression="Label10">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Home_Profile") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Home_Profile") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
</Columns></asp:GridView>

我评论过上述计划中遇到的问题。请帮助。

4 个答案:

答案 0 :(得分:1)

我看到你正在混合方法,模板方法(ItemTemplate,EditTemplate)和一些Code-Behind方法(在后面的代码中进行硬编码)。 对于你的cenario,我会在代码隐藏中做到这一点,以完全控制情况。 我添加了你的代码来解释我的消化。这是:

<asp:GridView ID="GridView3" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField>
            <HeaderTemplate>
                <asp:CheckBox ID="chkAll" runat="server" AutoPostBack="true" OnCheckedChanged="OnCheckedChanged" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" OnCheckedChanged="OnCheckedChanged" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Location_Profile_Name" SortExpression="Location_Profile_Name">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("Location_Profile_Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Home_Profile" SortExpression="Label10">
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" Text='<%# Bind("Home_Profile") %>'></asp:Label>
                <%--Here are the controls that edit this row, we will handle this on code-behind--%>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Home_Profile") %>' Visible="false"></asp:TextBox>
                <asp:Button ID="btnSave" Text="save" runat="server" Visible="false" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

“EditTemplate”已删除,您将处理自己的编辑模板。

        protected void OnCheckedChanged(object sender, EventArgs e)
    {
        //... Your code ...
        // Here we find the controls tha we will handle
        CheckBox chkAll = (GridView3.HeaderRow.FindControl("chkAll") as CheckBox);
        chkAll.Checked = true;
        foreach (GridViewRow row in GridView3.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                CheckBox CheckBox1 = (CheckBox)row.FindControl("CheckBox1");
                Label Label2 = (Label)row.FindControl("Label2");
                TextBox TextBox1 = (TextBox)row.FindControl("TextBox1");
                Button btnSave = (Button)row.FindControl("btnSave");

                //GridView3.SetEditRow(row.RowIndex);
                if (CheckBox1 != null)
                {
                    if (CheckBox1.Checked)
                    {

                        if (TextBox1 != null && Label2 != null)
                        {
                            // Shows your "Edit Template"
                            btnSave.Visible = true;
                            Label2.Visible = false;
                            TextBox1.Visible = true;
                            TextBox1.Text = Label2.Text;
                        }
                    }

                }
            }
        }
    }

目前,您可以控制情况:)

答案 1 :(得分:0)

请参阅此帖子Edit Update Delete Multiple Records

基本上你需要在gridview中添加

 <ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" 
              AutoPostBack="true" 
         OnCheckedChanged="chkSelect_CheckedChanged"/>
</ItemTemplate>

和代码背后:

protected void chkSelect_CheckedChanged
                        (object sender, EventArgs e)
    {
        CheckBox chkTest = (CheckBox)sender;
        GridViewRow grdRow = (GridViewRow)chkTest.NamingContainer;
        TextBox txtname = (TextBox)grdRow.FindControl("txtName");

        if (chkTest.Checked)
        {
            txtname.ReadOnly = false;                               
        }
        else
        {
            txtname.ReadOnly = true;                                
        }
    }

如果您熟悉Jquery,则可以在客户端轻松启用字段

答案 2 :(得分:0)

由于AutoGenerateEditButton = false,因此Home_Profile应该没有。应该在其中写入Home_Profile的TextBox模板,并且可见性应设置为false。

aspx代码是:

<asp:TemplateField HeaderText="Home_Profile" SortExpression="Label10">
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Home_Profile") %>'></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Home_Profile") %>' Visible="false"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>

答案 3 :(得分:-1)

我没有我以前做过的方式的代码,这里有一个使用类似逻辑的例子,你做了什么,我希望它有所帮助

这是一个工作示例,按照您的方式进行操作

背后的代码

public partial class _Default : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Name");

        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dt.NewRow();
            dr[0] = "Test " + i;
            dt.Rows.Add(dr);
        }

        rptITem.DataSource = dt;
        rptITem.DataBind();
    }

}


protected void UpdateCB(object sender, EventArgs e)
{
    foreach (RepeaterItem Item in rptITem.Items)
    {
        CheckBox cb = (CheckBox)Item.FindControl("cbTest");
        TextBox tb = (TextBox)Item.FindControl("tbTest");
        Label lb = (Label)Item.FindControl("lbTest");
        tb.Visible = cb.Checked;
        lb.Visible = !cb.Checked;
    }
}

protected void UpdateAll(object sender, EventArgs e)
{
    foreach (RepeaterItem Item in rptITem.Items)
    {
        CheckBox cb = (CheckBox)Item.FindControl("cbTest");
        TextBox tb = (TextBox)Item.FindControl("tbTest");
        Label lb = (Label)Item.FindControl("lbTest");
        cb.Checked = true;
        tb.Visible = true;
        lb.Visible = false;
    }
} }

Aspx代码

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:Repeater ID="rptITem" runat="server">
      <HeaderTemplate>
      <div style="border:1px solid black">
        <div style="width:50px; float:left"><asp:CheckBox ID="cbAll" runat="server" AutoPostBack="true" OnCheckedChanged="UpdateAll" /></div>
        <div style="width:200px; float:left;">Name</div>
        <div style="clear:both"></div>
      </div>
      </HeaderTemplate>
      <ItemTemplate>

        <div style="width:50px; float:left"><asp:CheckBox ID="cbTest" runat="server" AutoPostBack="true" OnCheckedChanged="UpdateCB" /></div>
        <div style="width:200px; float:left;"><asp:Label ID="lbTest" runat="server" Text='<%# Eval("Name") %>' ></asp:Label></div>
        <div style="width:200px; float:left;"><asp:TextBox ID="tbTest" runat="server" Text='<%# Eval("Name") %>' Visible="false"></asp:TextBox></div>
      </ItemTemplate>
      <SeparatorTemplate>
        <div style="clear:both"></div>
      </SeparatorTemplate>
    </asp:Repeater>
</asp:Content>