ASP.NET 2.0 Gridview CheckBox列

时间:2011-09-09 21:50:47

标签: c# asp.net data-binding gridview asp.net-2.0

我有一个显示三列数据的GridView。在第三列,我有一个CheckBox。我有两件事需要实现

  1. CheckBox将根据列值(1,0)
  2. 进行检查
  3. 如果选中,则两列中的其余列应显示####但是,这两列的数据应保留在数据库中。
  4. 如何实现这一目标?

    我是否可以在CheckBox事件中找到RowDataBound并检查该值并选中CheckBox选中并取消选中?如何制作其他列####

    新评论:

    string str = ((System.Data.DataRowView)(e.Row.DataItem)).Row.ItemArray[2].ToString();
    

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

    如果选中,则我尝试以下操作。

    ((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复选框已选中但列值未更改为“####”

1 个答案:

答案 0 :(得分:0)

您可以将商品列转换为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,但我个人更喜欢在aspx标记中没有任何代码。