开发者

ASP.NET 2.0 Gridview CheckBox column

开发者 https://www.devze.com 2023-04-03 17:21 出处:网络
I have a GridView that displays data on three columns. On the third column I have a CheckBox. I开发者_开发技巧 have two things that I need to achieve

I have a GridView that displays data on three columns. On the third column I have a CheckBox. I开发者_开发技巧 have two things that I need to achieve

  1. CheckBox will be checked based on the column value (1,0)
  2. If it is checked the rest of the two columns should display #### However the data for the two columns should remain in the database.

How can this be achieved?

Can I find the CheckBox on RowDataBound event and check the value and make the CheckBox checked and unchecked? How about making the other columns ####?

NEW Comments:

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

this helps to set the checkbox checked or not.

if checked is true I am trying the following.

((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();

It is displaying the gridview checkbox as checked but the column value is not changed to "####"


You can turn your item columns into TemplateColumns and do the following which will localize your code to the control level and you don't have to worry about all the searching. I pefer to never use the built in column types because there are usually future enhancements that require changing the columns to TemplateColumns anyways. It also gives you a lot of flexibiltiy on useage.

Here is an example:

<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>

Then in your codebehind implement each control's 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"));
}

The advantages to doing it this way is your could replace code easily as it is all isolated and has no 'searching' for expected controls. I very rarely use the RowDataBound event because it makes you have to write specific code to look for the controls and it makes more sense to me to have the code localized to the control. If someone changes something they know there are ONLY affecting that one control instead of everything on the row possibly as a side effect. You could also use the <%# method and do the Evals right in the markup but I personally prefer to never have any code in the aspx markup at all.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号