VB.net DetailsПросмотреть, чтобы использовать более одного источника данных? - PullRequest
1 голос
/ 05 января 2012

У меня есть DetailsView, который выглядит почти идеально. Единственное, есть одно поле, которое фактически получает информацию из другой таблицы. Это поле идентификатора, которое связано с другой таблицей в базе данных, и я надеялся, что есть какой-то способ получить это одно поле в DetailsView для извлечения информации из другой таблицы.

Можно ли добавить знак + (плюс) рядом с идентификатором PicklistID, а затем показать результаты другого запроса? (ВЫБЕРИТЕ ТЕКСТ ИЗ ПИКЛИСТА, ГДЕ PicklistID = @PicklistID ???)

ОБНОВЛЕНИЕ 1/11/12: PICKLISTID в таблице PICKLIST не является уникальным или первичным ключом, поэтому я не могу ссылаться на него из таблицы SURVEY. Есть ли способ связать эти 2 столбца, чтобы я мог просто изменить свой оператор SELECT в своем DetailsView, чтобы включить PICKLISTID?

ОБНОВЛЕНИЕ 1/23/12: Я все еще застрял на этом. Я не понимаю, как заставить это работать вообще. Помощь будет оценена. Я все еще новичок ....

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Label ID="Label2" runat="server" Text="<h3>Manage Questions</h3>"></asp:Label>
<table style="width: 100%">
<tr>
<td align="right">
<asp:Label ID="Label1" runat="server" Text="Select Survey:"></asp:Label>
</td>
<td>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"
    DataSourceID="dsSurvey" DataTextField="SurveyName" DataValueField="SurveyID">
</asp:DropDownList>
</td>
</tr>
<tr>
<td colspan="2">
<asp:DetailsView ID="dvSurveyQuestions" runat="server" AllowPaging="True" 
 AutoGenerateRows="False" CellPadding="4" DataKeyNames="QuestionID" 
 DataSourceID="dsSurveyQuestions" ForeColor="#333333" GridLines="None" 
 Height="50px" Width="100%">
<FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<CommandRowStyle BackColor="#E2DED6" Font-Bold="True" />
<EditRowStyle BackColor="#999999" />
<RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
<PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
<Fields>
    <asp:BoundField DataField="QuestionID" HeaderText="QuestionID" 
     InsertVisible="False" ReadOnly="True" SortExpression="QuestionID" />
    <asp:TemplateField HeaderText="Question" SortExpression="Question">
        <EditItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" 
             Text='<%# Bind("Question") %>'></asp:TextBox>
        </EditItemTemplate>
        <InsertItemTemplate>
            <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" 
             Text='<%# Bind("Question") %>'></asp:TextBox>
        </InsertItemTemplate>
        <ItemTemplate>
            <asp:Label ID="lblQuestion" runat="server" Text='<%# Bind("Question") %>'>
            </asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Answer Type" SortExpression="AnswerType">
        <EditItemTemplate>
            <asp:DropDownList ID="DropDownList2" runat="server" 
                SelectedValue='<%# Bind("AnswerType") %>'>
                <asp:ListItem Value="S">Single Choice (radio button)</asp:ListItem>
                <asp:ListItem Value="M">Multiple Choices (checkboxes)</asp:ListItem>
                <asp:ListItem Value="T">Text (textbox)</asp:ListItem>
            </asp:DropDownList>
        </EditItemTemplate>
        <InsertItemTemplate>
            <asp:DropDownList ID="DropDownList3" runat="server" 
                SelectedValue='<%# Bind("AnswerType") %>'>
                <asp:ListItem Value="S">Single Choice (radio button)</asp:ListItem>
                <asp:ListItem Value="M">Multiple Choices (checkboxes)</asp:ListItem>
                <asp:ListItem Value="T">Text (textbox)</asp:ListItem>
            </asp:DropDownList>
        </InsertItemTemplate>
        <ItemTemplate>
            <asp:Label ID="lblAnswerType" runat="server" 
             Text='<%# Bind("AnswerType") %>'></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Question Type" SortExpression="QType">
        <EditItemTemplate>
            <asp:DropDownList ID="DropDownList4" runat="server" 
                SelectedValue='<%# Bind("QType") %>'>
                <asp:ListItem Value="Picklist">Picklist</asp:ListItem>
                <asp:ListItem Value="Text">Text</asp:ListItem>
            </asp:DropDownList>
        </EditItemTemplate>
        <InsertItemTemplate>
            <asp:DropDownList ID="DropDownList5" runat="server" 
                SelectedValue='<%# Bind("QType") %>'>
                <asp:ListItem Value="Picklist">Picklist</asp:ListItem>
                <asp:ListItem Value="Text">Text</asp:ListItem>
            </asp:DropDownList>
        </InsertItemTemplate>
        <ItemTemplate>
            <asp:Label ID="lblQType" runat="server" Text='<%# Bind("QType") %>'>
            </asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField HeaderText="Answer" SortExpression="TEXT">
        <EditItemTemplate>

        </EditItemTemplate>
        <InsertItemTemplate>

        </InsertItemTemplate>
        <ItemTemplate>
            <asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Bind("PicklistID") %>' />
            <asp:SqlDataSource ID="dsPicklist" runat="server" 
    ConnectionString="<%$ ConnectionStrings:SurveyConnectionString %>" 
    SelectCommand="SELECT DISTINCT p.TEXT, p.PICKLISTID 
                   FROM PICKLIST p JOIN C_Survey_Questions c 
                   ON c.PicklistID = p.PICKLISTID 
                   AND c.SurveyID = @SurveyID 
                   ORDER BY p.TEXT">
                <SelectParameters>
                    <asp:ControlParameter ControlID="HiddenField1" Name="PicklistID" 
            PropertyName="SelectedValue" Type="String" />

                </SelectParameters>
            </asp:SqlDataSource>
            <asp:Label ID="lblTEXT" runat="server" Text=""></asp:Label>
        </ItemTemplate>
    </asp:TemplateField>

    <asp:BoundField DataField="QuestionNum" HeaderText="Question Number" 
        SortExpression="QuestionNum" />
    <asp:BoundField DataField="Subsequence" HeaderText="Subsequence" 
        SortExpression="Subsequence" />
    <asp:CheckBoxField DataField="Active" HeaderText="Active" 
            SortExpression="Active" />

    <asp:BoundField DataField="Script" HeaderText="Script" 
        SortExpression="Script" />

    <asp:CheckBoxField DataField="Question_Locked" HeaderText="Question Locked" 
            SortExpression="Question_Locked" />

    <asp:BoundField DataField="QHelp" HeaderText="Question Help" 
        SortExpression="QHelp" />
    <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" 
        ShowInsertButton="True" />
    </Fields>
<FieldHeaderStyle BackColor="#E9ECF1" Font-Bold="True" Width="10%" />
<HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
</asp:DetailsView>
</td>
</tr>
</table>

<asp:SqlDataSource ID="dsSurvey" runat="server" 
    ConnectionString="<%$ ConnectionStrings:SurveyConnectionString %>" 
    SelectCommand="SELECT [SurveyID], [SurveyName] 
                   FROM [C_Survey] 
                   ORDER BY [SurveyName]">
</asp:SqlDataSource>

<asp:SqlDataSource ID="dsSurveyQuestions" runat="server" 
    ConnectionString="<%$ ConnectionStrings:SurveyConnectionString %>" 
    DeleteCommand="DELETE FROM [C_Survey_Questions] WHERE [QuestionID] = @QuestionID" 
    InsertCommand="INSERT INTO [C_Survey_Questions] ([SurveyID], [Question], [QType],
                   [PickListID], [QuestionNum], [Subsequence], [Active], [Script], 
                   [Question_Locked], [QHelp], [Createdate], 
                   [Modifydate], [AnswerType]) 
                   VALUES (@SurveyID, @Question, @QType, @PickListID, @QuestionNum, 
                   @Subsequence, @Active, @Script, @Question_Locked, @QHelp, 
                   getdate(), getdate(), @AnswerType)" 
    SelectCommand="SELECT * FROM [C_Survey_Questions] 
                   WHERE ([SurveyID] = @SurveyID)" 
    UpdateCommand="UPDATE [C_Survey_Questions] SET [SurveyID] = @SurveyID, 
                   [Question] = @Question, [QType] = @QType, 
                   [PickListID] = @PickListID, [QuestionNum] = @QuestionNum,
                   [Subsequence] = @Subsequence, [Active] = @Active, 
                   [Script] = @Script, [Question_Locked] = @Question_Locked, 
                   [QHelp] = @QHelp, [Modifydate] = getdate(), 
                   [AnswerType] = @AnswerType 
                   WHERE [QuestionID] = @QuestionID">
    <DeleteParameters>
        <asp:Parameter Name="QuestionID" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="SurveyID" Type="Int32" />
        <asp:Parameter Name="Question" Type="String" />
        <asp:Parameter Name="QType" Type="String" />
        <asp:Parameter Name="PickListID" Type="String" />
        <asp:Parameter Name="QuestionNum" Type="Int32" />
        <asp:Parameter Name="Subsequence" Type="Int32" />
        <asp:Parameter Name="Active" Type="Boolean" />
        <asp:Parameter Name="Script" Type="String" />
        <asp:Parameter Name="Question_Locked" Type="Boolean" />
        <asp:Parameter Name="QHelp" Type="String" />
        <asp:Parameter Name="Createdate" Type="DateTime" />
        <asp:Parameter Name="Modifydate" Type="DateTime" />
        <asp:Parameter Name="AnswerType" Type="String" />
    </InsertParameters>
    <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" Name="SurveyID" 
            PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="SurveyID" Type="Int32" />
        <asp:Parameter Name="Question" Type="String" />
        <asp:Parameter Name="QType" Type="String" />
        <asp:Parameter Name="PickListID" Type="String" />
        <asp:Parameter Name="QuestionNum" Type="Int32" />
        <asp:Parameter Name="Subsequence" Type="Int32" />
        <asp:Parameter Name="Active" Type="Boolean" />
        <asp:Parameter Name="Script" Type="String" />
        <asp:Parameter Name="Question_Locked" Type="Boolean" />
        <asp:Parameter Name="QHelp" Type="String" />
        <asp:Parameter Name="Modifydate" Type="DateTime" />
        <asp:Parameter Name="AnswerType" Type="String" />
        <asp:Parameter Name="QuestionID" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>
</asp:Content>



Partial Class Admin_ManageQuestions
Inherits System.Web.UI.Page
Protected Sub dsPicklist_ItemSelecting(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles Me.Load
    Dim myControl1 As Control = FindControl("lblTEXT")
    If (Not myControl1 Is Nothing) Then
        myControl1.DataBind()
    Else
        'Control not found
    End If
End Sub
Protected Sub dvSurveyQuestions_ItemInserting(ByVal sender As Object, ByVal e As 
System.Web.UI.WebControls.DetailsViewInsertEventArgs) Handles 
dvSurveyQuestions.ItemInserting
    'The DetailsView does not include SurveyID column...we need to set this column 
     during INSERT operations because each question must belong to some survey.
    e.Values("SurveyID") = DropDownList1.SelectedValue
End Sub
Protected Sub dvSurveyQuestions_ItemUpdating(ByVal sender As Object, ByVal e As 
System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles 
dvSurveyQuestions.ItemUpdating
    'The DetailsView does not include SurveyID column...we need to set this column 
     during UPDATE operations because each question must belong to some survey.
    e.NewValues("SurveyID") = DropDownList1.SelectedValue
End Sub
Protected Sub dvSurveyQuestions_DataBound(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles dvSurveyQuestions.DataBound
    'The event handler checks the row count of the DetailsView control. 
     If it is zero then the mode of the DetailsView is changed to Insert using 
     ChangeMode() method.
    If dvSurveyQuestions.Rows.Count = 0 Then
        dvSurveyQuestions.ChangeMode(DetailsViewMode.Insert)
    End If
End Sub
End Class  

1 Ответ

1 голос
/ 05 января 2012

Вы можете сделать это, но, возможно, не так, как вы хотите.

Самый простой способ - использовать событие DataBinding в самом DetailsView.Затем используйте код для запуска запроса.

Другой способ - создать собственный элемент управления в качестве подкласса BoundField и переопределить OnDataBindField метод

Наиболее эффективным способом было бы объединение данных в источнике в DataView или другой конструкции.В идеале объединение данных должно быть сделано как можно ближе к фактическому источнику данных (например, в запросе или представлении SQL), чтобы избежать ненужных поездок по сети к базе данных.Для одного ряда это не будет большой проблемой, но это, как правило, то, что вы должны делать.

...