ASP..NET 2.0 Gridview复选框列

本文关键字:复选框 Gridview NET ASP | 更新日期: 2023-09-27 18:08:23

我有一个GridView,它在三列中显示数据。第三列是CheckBox。我有两件事需要完成

  1. CheckBox将根据列值(1,0)
  2. 检查
  3. 如果选中,剩下的两列应该显示####,但是这两列的数据应该保留在数据库中。

如何做到这一点?

我可以在RowDataBound事件上找到CheckBox并检查值,并使CheckBox检查和不检查吗?把其他列改成####怎么样?

<标题>新评论:
string str = ((System.Data.DataRowView)(e.Row.DataItem)).Row.ItemArray[2].ToString();

这有助于设置复选框是否被选中。

如果checked为true,则尝试执行以下操作。

((System.Data.DataRowView)(e.Row.DataItem)).Row.ItemArray[0] = "#####";
((System.Data.DataRowView)(e.Row.DataItem)).Row.ItemArray[1] = "#####";
((System.Data.DataRowView)(e.Row.DataItem)).Row.AcceptChanges();

显示gridview复选框为选中状态,但列值未更改为"####"

ASP..NET 2.0 Gridview复选框列

您可以将您的项目列转换为TemplateColumns并执行以下操作,这将使您的代码本地化到控制级别,您不必担心所有的搜索。我宁愿永远不要使用内置的列类型,因为未来的增强通常需要将列更改为TemplateColumns。它也给了你很大的使用灵活性。

下面是一个例子:

<asp:GridView ID="grdYourGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="YourField1">
            <ItemTemplate>
                <asp:Literal runat="server" ID="ltYourField1" 
                    OnDataBinding="ltYourField1_DataBinding" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="YourField2">
            <ItemTemplate>
                <asp:Literal runat="server" ID="ltYourField2" 
                    OnDataBinding="ltYourField2_DataBinding" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="YourCheckBoxField">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chkYourCheckBoxField" 
                    OnDataBinding="chkYourCheckBoxField_DataBinding" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

然后在你的代码后面实现每个控件的OnDataBinding:

protected void ltYourField1_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)(sender);
    lt.Text = (bool)(Eval("YourCheckBoxField")) ?
        "##########" : Eval("YourField1");
}
protected void ltYourField2_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)(sender);
    lt.Text = (bool)(Eval("YourCheckBoxField")) ?
        "##########" : Eval("YourField2");
}
protected void chkYourCheckBoxField_DataBinding(object sender, System.EventArgs e)
{
    CheckBox chk = (CheckBox)(sender);
    chk.Checked = (bool)(Eval("YourCheckBoxField"));
}

这样做的好处是你可以很容易地替换代码,因为它是完全隔离的,不需要"搜索"预期的控件。我很少使用RowDataBound事件,因为它使您必须编写特定的代码来查找控件,并且对我来说将代码本地化到控件更有意义。如果有人改变了一些东西,他们知道这只会影响到一个控件,而不是一行上的所有东西,可能会产生副作用。您也可以使用<%#方法并在标记中正确地执行Eval s,但我个人更喜欢在aspx标记中根本没有任何代码。