Отображение CheckBox в Gridview DataBound на основе столбца varchar

Структура таблицы SQL Server:

ChapName        varchar(200)
Status          varchar(1)

Требование:

  • Я хочу отобразить флажок в представлении сетки ASP.NET из Visual Studio 2010, если значение столбца состояния равно T, пусть оно будет проверено и снято в противном случае. но он показывает только текстовое поле.
  • Я пробовал <asp:templatefield> и <asp:itemtemplate>, но при попытке установить этот флажок выдает ошибку.
  • требуется любой пример кода, так как я новичок в этой области.

Код, который я пробовал:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
            CheckBox c = (CheckBox)GridView1.FindControl("ChkStatus");
            TextBox TB = (TextBox)GridView1.FindControl("Status");

        //Response.Write(TB.Text);
            if (TB.Text == "T")
            {
                c.Checked = true;
            }
            else
            {
                c.Checked = false;
            }
    }

Ошибка, которую я получил

В экземпляре объекта не задана ссылка на объект.

Описание: во время выполнения текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении:
System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.

Разметка Aspx:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
              DataKeyNames="Comp,QTypeCode" DataSourceID="SDS_QType_Edit" 
              BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" 
              BorderWidth="1px" 
              CellPadding="4" ForeColor="Black" GridLines="Vertical" 
              AllowPaging="True" AllowSorting="True" 
              onselectedindexchanged="GridView1_SelectedIndexChanged" 
              onrowdatabound="GridView1_RowDataBound">
    <AlternatingRowStyle BackColor="White" />
    <Columns>
        <asp:CommandField ShowEditButton="True" ShowSelectButton="True" />
        <asp:BoundField DataField="QTypeCode" HeaderText="QTypeCode" 
                        SortExpression="QTypeCode" InsertVisible="False" 
                        ReadOnly="True" />
        <asp:BoundField DataField="Descr" HeaderText="Descr" SortExpression="Descr" />
        <asp:CheckBoxField DataField="AnsReq" HeaderText="AnsReq" ReadOnly="True" 
                           SortExpression="AnsReq" />
        <asp:CheckBoxField DataField="OptionPrint" HeaderText="OptionPrint" 
                           ReadOnly="True" SortExpression="OptionPrint" />
        <asp:BoundField DataField="Status" HeaderText="Status" 
                        SortExpression="Status" />
        <asp:BoundField DataField="TransDate" HeaderText="TransDate" 
                        SortExpression="TransDate" />
        <asp:BoundField DataField="UserName" HeaderText="UserName" 
                        SortExpression="UserName" />
        <asp:TemplateField HeaderText="Check Box" >
            <ItemTemplate>
                <asp:CheckBox ID ="ChkStatus" Text="text" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
     </Columns>
     <EditRowStyle Wrap="False" />
     <EmptyDataRowStyle Wrap="False" />
     <FooterStyle BackColor="#CCCC99" />
     <HeaderStyle Wrap="False" BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
     <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
     <RowStyle Wrap="False" BackColor="#F7F7DE" />
     <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" 
                       Wrap="False" />
     <SortedAscendingCellStyle BackColor="#FBFBF2" />
     <SortedAscendingHeaderStyle BackColor="#848384" />
     <SortedDescendingCellStyle BackColor="#EAEAD3" />
     <SortedDescendingHeaderStyle BackColor="#575357" />
</asp:GridView>

person classic classic    schedule 01.05.2013    source источник
comment
можете ли вы обновить вопрос с помощью кода gridview в файле aspx?   -  person Damith    schedule 01.05.2013


Ответы (1)


Предположим, что у вас есть сетка, определенная, как показано ниже, на asmx.

<asp:GridView ID="GridView1" runat="server" 
    onrowdatabound="GridView1_RowDataBound" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="ChapName" HeaderText="ChapName" />
        <asp:TemplateField HeaderText="Status" Visible ="false">
            <ItemTemplate>
                <asp:Label ID="Status" runat="server" Text='<%# Bind("Status") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Check Box" >
        <ItemTemplate>
            <asp:CheckBox ID ="ChkStatus" Text="text" runat="server" />
        </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

в событии Row Data Bound вы можете найти элементы управления, как показано ниже.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{

    CheckBox c = e.Row.FindControl("ChkStatus") as CheckBox;
    Label lbl = e.Row.FindControl("Status") as Label;
    if (c!= null && lbl != null )
    {
        c.Checked = (lbl.Text == "T");
    }

}
person Damith    schedule 01.05.2013
comment
это не работает. та же ошибка Ссылка на объект не указывает на экземпляр объекта - person classic classic; 01.05.2013
comment
Хорошо, какая линия? и можете ли вы обновить вопрос с кодом gridview в aspx? - person Damith; 01.05.2013
comment
Вы не добавили поле шаблона для статуса, поэтому это не работает. добавьте поле шаблона и внутри этого добавьте метку, как мой ответ. дать идентификатор метки как статус - person Damith; 01.05.2013
comment
это работает. отлично. но я не мог понять, так как поле с привязкой к данным статуса также есть, и вы также использовали статус идентификатора для метки.. большое спасибо... - person classic classic; 01.05.2013
comment
Поле статуса скрыто. на основании его значения при привязке данных строки принимается решение, будет ли установлен флажок или нет. поэтому необходимо скрытое поле статуса. - person ashubuntu; 28.12.2016