Просмотр сведений о ASP.NET. Как привязать значение не в источнике данных объекта

У меня есть ASP.NET DetailsView, привязанный к источнику объектных данных (ODS). У меня есть метод для события ODS OnSelecting, и в этом методе на основе полей, возвращаемых из источника данных объекта, мы выполняем еще один поиск в базе данных, чтобы получить значение «Риск» для записи.

Мой вопрос в том, как связать / eval и отобразить это дополнительное поле «Риск», мне было трудно, потому что он не помещает источник данных, привязанный к подробному просмотру.

Я пробовал просто добавить элемент управления Label в DetailsView ItemTemplate, но вы не можете добавить идентификатор к элементу управления, чтобы ссылаться на него в коде позади. Любые идеи?

Обновите здесь код

Вот простой пример кода того, что я пытаюсь сделать

 <asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="ObjectDataSource1">
        <Fields>
            <asp:TemplateField ShowHeader="False">
                <ItemTemplate>
                    <div style="float: right">
                        <asp:Label  runat="server" Text="NEED RISK HERE"></asp:Label>
                    </div>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:Button ID="ButtonUpdate" runat="server" CausesValidation="True" CommandName="Update"
                        Text="Update" />
                    &nbsp;
                    <asp:Button ID="ButtonCancelUpdates" runat="server" CausesValidation="False" CommandName="Cancel"
                        Text="Cancel" />
                </EditItemTemplate>
            </asp:TemplateField>
        </Fields>
    </asp:DetailsView>
    <br />
    <br />
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OnSelecting="ods1_Selecting"
        SelectMethod="GetMemoryDataTable" TypeName="AspMemoryDatatableDemo.MemoryDataTableProvider">
    </asp:ObjectDataSource>

Код позади

  public String GetRisk()
    {
        return "HIGH";
    }


    protected void ods1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
    {
      // Get Risk based on row data
      // Need some way of showing this in the DetailsView

        GetRisk();
    }

введите описание изображения здесь

Набор данных фактически будет поступать из объекта данных, но в этом примере я просто использую данные в памяти.


person Hevski    schedule 07.03.2015    source источник


Ответы (1)


Я постараюсь помочь вам здесь, но было бы очень полезно, если бы вы показали нам код для подобной проблемы. Вы пробовали добавить столбец в источник данных объекта? Я предполагаю, что у вас есть какой-то datatable (если нет, преобразуйте его в datatable). Так что давайте просто добавим столбец и заново свяжем его ...


HTML

<div>

<asp:GridView id="myGridView" AutoGenerateColumns="true" runat="server">

</asp:GridView>
    <br />
    <asp:TextBox ID="column_name" runat="server"></asp:TextBox>
    <asp:Button ID="addColumn" Text="Add Column" runat="server" />
</div>

VB.NET

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

    ' ===========================================================================
    '  This section is just to create a datatable. I assume you are already have one 
    '      that gets retrieved from a database somewhere.
    Dim dt As New DataTable ' create new test datatable

    With dt.Columns ' add columns to datatable
        .Add("id").AutoIncrement = True
        .Add("value")
    End With

    For i = 1 To 4 ' add some rows and values to the datatable.
        Dim msg = String.Empty
        Select Case i
            Case 1
                msg = "this"
            Case 2
                msg = "is"
            Case 3
                msg = "a test"
            Case 4
                msg = "table"
        End Select
        Dim r As DataRow = dt.NewRow()
        r("value") = msg
        dt.Rows.Add(r)
    Next i
    ' ===========================================================================

    myGridView.DataSource = dt ' set our datasource
    myGridView.DataBind() ' bind our data source

End Sub


Protected Sub addColumn_Click(sender As Object, e As EventArgs) Handles addColumn.Click
    Dim dt As DataTable = DirectCast(myGridView.DataSource, DataTable) ' get the current datatable used by your gridview.
    If Not String.IsNullOrWhiteSpace(column_name.Text) Then ' check if the new column name is null or empty.
        dt.Columns.Add(column_name.Text).DefaultValue = "new value" ' just here to add a default value. yours presumably will already have a value.
        myGridView.DataSource = dt ' update the datasource.
        myGridView.DataBind() ' bind the new datasource.

    End If
End Sub

СТРАНИЦА ПЕРЕД ДОБАВЛЕНИЕМ КОЛОННЫ

До


СТРАНИЦА ПОСЛЕ ДОБАВЛЕНИЯ КОЛОННЫ

После

person Lopsided    schedule 07.03.2015
comment
Спасибо. Я обновил свой вопрос с помощью примера кода, может помочь. Набор данных, к которому я привязываю ODS, поступает из структуры сущностей и представляет собой просто представление базы данных. Я заметил, что в вашем примере вы добавляете новый столбец в свой datatable. Мне нужно добавить новое поле в мою сущность, или в моем примере datatable - person Hevski; 08.03.2015
comment
@Hevski представление базы данных по-прежнему является таблицей возвращаемых данных. Тем не менее, я почти уверен, что все, что отображается в представлении данных или представлении сетки, может быть отформатировано как DataTable и, следовательно, к нему могут быть добавлены строки и / или столбцы. Если вам нужен больший контроль над тем, что вы показываете, создайте контроллер ASP Web API, в нем установите соединение с базой данных и получите / заполните данные, затем сериализуйте его с помощью библиотеки Newtonsoft json.net, верните его вызывающей стороне API и затем отобразите таблицу с помощью javascript. Я давно начал этим заниматься вместо использования ASP, и он отлично работает. - person Lopsided; 08.03.2015