Вернуть бизнес-объект из вида сетки - PullRequest
4 голосов
/ 22 июня 2010

Что именно возвращает e.Row.DataItem .. MSDN говорит .. возвращает Объект, представляющий базовый объект данных, с которым связан объект GridViewRow.

Вот мой DataGrid ...

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="ObjectDataSource1" OnRowDataBound="GridView1_RowDataBound">
        <Columns>
            <asp:BoundField DataField="PracticeCode" HeaderText="PracticeCode" SortExpression="PracticeCode" />
            <asp:BoundField DataField="AccountNo" HeaderText="AccountNo" SortExpression="AccountNo" />
            <asp:BoundField DataField="PatientName" HeaderText="PatientName" SortExpression="PatientName" />
            <asp:TemplateField HeaderText="Status">
                <ItemTemplate>
                    <asp:Label ID="LblStatus" runat="server"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

И я связываю его с моим бизнес-объектом List .. В строке DataBound Event я пытаюсь это ...

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        Patient p1 = (Patient)e.Row.DataItem;
        Label lbl = e.Row.FindControl("LblStatus") as Label;

        if (p1 == null)
        {
            throw new Exception("P1 is null");
        }

        if (p1.OpenItems.Count > 0)
        {
            lbl.Text = "Has open Items";
        }
        else
        {
            lbl.Text = "";
        }
    }

Я получаю исключение P1 равно нулю ... Почему так ... Чего мне не хватает ..

Примечание : Могут быть и другие способы сделать это, но я особенно смотрю, почему мой p1 равен нулю ... и есть ли способ получить объект Patient вернуться из GridView после привязки.

1 Ответ

7 голосов
/ 22 июня 2010

RowDataBound также вызывается для верхнего и нижнего колонтитула, вы должны убедиться, что вы в настоящий момент в DataRow перед вызовом e.Row.DataItem:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {                
       if(e.Row.RowType != DataControlRowType.DataRow)
          return;

       Patient p1 = (Patient)e.Row.DataItem;
...