Как использовать параметр вставки с текстом текстового поля в просмотре списка

1

Я пытаюсь использовать свой SqlDataSource для ввода элементов в базу данных со значениями из TextBox, но ничто не вставляет.

Вот мой SqlDataSource:

<asp:SqlDataSource ID="SectionDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:ORHP_Dev03182014ConnectionString %>" SelectCommand="SELECT DISTINCT SectionItem FROM Core.SectionItem_Lkup">               
</asp:SqlDataSource>

<asp:SqlDataSource ID="SectionIDDataSource" runat="server " ConnectionString="<%$ ConnectionStrings:ORHP_Dev03182014ConnectionString %>" InsertCommand="INSERT INTO Core.SectionItem_Lkup(SectionItemID, SectionItem, SectionItemLabel) VALUES (@SectionID, @SectionItem, @SectionItemLabel)" SelectCommand="  SELECT MAX(SectionItemID) + 1 AS SectionItemID FROM [ORHP_Dev03182014].[Core].[SectionItem_Lkup]" OnInserting="Section_OnInserted">
    <InsertParameters>
        <asp:Parameter Name="SectionID" />
        <asp:Parameter Name="SectionItem" />
        <asp:Parameter Name="SectionItemLabel" />
    </InsertParameters>
</asp:SqlDataSource>

Вот текстовые поля в списке:

<InsertItemTemplate>
    <tr style="">
        <td>
            <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="Insert" On />
            <asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="Clear" />
        </td>
        <td>
            <div style="font-size: .8em;">
            <asp:FormView ID="SectionIDFormView" runat="server" DataKeyNames="SectionItemID" DataSourceID="SectionIDDataSource">
            <ItemTemplate>
                <asp:Label ID="SectionIDLabel" runat="server" Text="SectionID" Font-Bold="true" Font-Size="1.2em" />
                <asp:TextBox ID="SectionIDTextBox" runat="server" Text='<%# Eval("SectionItemID") %>' Width="50px" />
                <asp:Label ID="SectionItemLabel" runat="server" Text="SectionItem" Font-Bold="true" Font-Size="1.2em" />
                <asp:TextBox ID="SectionItemTextBox" runat="server" Text="" />
                <asp:Label ID="SectionItemSubLabel" runat="server" Text="SectionItem Label" Font-Bold="true" Font-Size="1.2em" />
                <asp:TextBox ID="SectionItemLabelTextBox" runat="server" Text="" />
            </ItemTemplate>
            </asp:FormView>
        </div>
      </td>
   </tr>
</InsertItemTemplate>

Вот мой код:

using (SqlConnection connection = new SqlConnection("Data Source=RCK-HRSA-DB01;Initial Catalog=ORHP_Dev03182014;User ID=userid;Password=password"))
{
    try
    {
        SqlCommand cmd1 = new SqlCommand("INSERT INTO Core.SectionItem_Lkup(SectionItemID, SectionItem, SectionItemLabel) VALUES (" + SectionIDTextBox.Text + ", " + SectionItemTextBox.Text + ", " + SectionItemLabelTextBox.Text + ")");
        connection.Open();
        cmd1.Connection = connection;
        cmd1.CommandType = CommandType.Text;
        cmd1.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
    }
}

Я что-то упускаю?

  • 1
    Одна вещь, которую я заметил, состоит в том, что источником данных вашего FormView является SectionIDDataSource а SectionIDDataSource вашего SqlDataSource является SectionDataSource . Все ли ваши SqlDataSources совпадают правильно?
  • 0
    @BubbleHearth Это может быть проблемой. Я использую два источника данных через эту часть. Однако мне нужно было SectionIDDataSource, чтобы получить SectionItemID. Должен ли я поместить команды вставки в другой источник данных или оба?
Показать ещё 2 комментария
Теги:
sql-server

1 ответ

1
Лучший ответ

Проблема, с которой вы столкнетесь, когда вы идете по маршруту, вы собираетесь найти элементы управления для ваших контрольных параметров. Когда элемент управления находится в пределах элемента управления, связанного с данными, идентификатор не является тем, что вы его объявляете. Это можно увидеть, когда вы просматриваете источник на своей странице после его рендеринга.

Для FormViews обычно это выглядит как нечто вроде SectionIDFormView$SectionIDLabel, что явно не совпадает с SectionIDLabel. Таким образом, использование ControlParameter, например, может работать на вас:

<InsertParameters>
    <asp:ControlParameter ControlID="SectionIDFormView$SectionIDLabel"
        Direction="Input" Name="SectionID" PropertyName="Text" />
</InsertParameters>

В качестве альтернативы, когда нажата кнопка " Insert в элементе "Список", обработайте событие щелчка и внесите туда вставку. Возьмите вставку от SqlDataSource вместе.

protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
{
    if (e.CommandName == "Insert")
    {
        ListViewItem item = ListView1.InsertItem;
        FormView SectionIDFormView = (FormView)item.FindControl("SectionIDFormView");
        TextBox SectionIDTextBox = (TextBox)SectionIDFormView.FindControl("SectionIDTextBox");
        //Find your other controls
        //Do your insert
    }
}

Попробуйте использовать параметризованный запрос:

SqlCommand cmd1 = new SqlCommand("INSERT INTO Core.SectionItem_Lkup(SectionItemID, SectionItem, SectionItemLabel) VALUES (@SectionItemID, @SectionItem, @SectionItemLabel)");

cmd1.Parameters.AddWithValue("@SectionItemID", SectionIDTextBox.Text);
cmd1.Parameters.AddWithValue("@SectionItem", SectionItemTextBox.Text);
cmd1.Parameters.AddWithValue("@SectionItemLabel", SectionItemLabelTextBox.Text);
  • 0
    Как мне обработать событие click? Я помещаю OnItemCommand = "SectionListView_OnItemCommand" в свойствах ListView, но он никогда не достигает метода SectionListView_OnItemCommand
  • 1
    и вы нажимаете кнопку в вашем ListView, у которого установлен атрибут CommandName ?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню