Member 14947087 Ответов: 1

Как добавить данные в gridview с помощью кнопки click


У меня есть вложенный gridview. На сетке верхнего уровня у меня есть кнопка, которая должна вызвать хранимую процедуру и поместить эти данные во вложенный gridview.

Вот мой код страницы ASPX
<form id="form1" runat="server">
<asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="false" CssClass="Grid"
    DataKeyNames="ID" OnRowDataBound="OnRowDataBound">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button Text="Expand" runat="server" OnClick="Select" CommandArgument='<%#Eval("ID") %>' />
                <asp:Panel ID="pnlOrders" runat="server" Style="display: none">
                    <asp:GridView ID="gvOrders" runat="server" AutoGenerateColumns="false" CssClass = "ChildGrid">
                        <Columns>
                            <asp:BoundField ItemStyle-Width="135px" DataField="Label" HeaderText="Label" />
                            <asp:BoundField ItemStyle-Width="150px" DataField="IDs" HeaderText="IDs" />

                            <asp:BoundField ItemStyle-Width="150px" DataFormatString="${0:###,###,###.00}" DataField="Total" HeaderText=Total" />
                        </Columns>
                    </asp:GridView>
                </asp:Panel>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField ItemStyle-Width="150px" DataField="Source" HeaderText="Source" />
        <asp:BoundField ItemStyle-Width="150px" DataField="Label" HeaderText="Label" />
        <asp:BoundField ItemStyle-Width="150px" DataFormatString="${0:###,###,###.00}" DataField="Total20" HeaderText="Total20" />
        <asp:BoundField ItemStyle-Width="150px" DataFormatString="${0:###,###,###.00}" DataField="Total1" HeaderText="Total1" />
        <asp:BoundField ItemStyle-Width="150px" DataFormatString="{0:P1}"  DataField="Average_Fee_PCT" HeaderText="Average Fee" />
    </Columns>
</asp:GridView>
</form>


Вот мой код C#
protected void Select(object sender, EventArgs e)
{
    string ID = (sender as Button).CommandArgument;

            Response.Write("<script>console.log('ID...." + ID + "');</script>");
            
        GridView gvOrders = e.Row.FindControl("gvOrders") as GridView;          
        gvOrders.DataSource = GetData(string.Format("exec ReturnDataSingle '" + ID + "', '"+ DateTime.Now.ToString("yyyy-MM-dd") + "'"));
        gvOrders.DataBind();


}


Вот сообщение об ошибке, которое я получаю
'System.EventArgs' does not contain a definition for 'Row' and no extension method 'Row' accepting a first argument of type 'System.EventArgs' could be found 


Может ли кто-нибудь помочь мне выяснить, как я смогу добавить данные хранимой процедуры в gvOrders gridview на основе этого нажатия кнопки?

Что я уже пробовал:

Кажется, я не могу понять, как добавить эти данные в таблицу с помощью нажатия кнопки.

Richard Deeming

GetData(string.Format("exec ReturnDataSingle '" + ID + "', '"+ DateTime.Now.ToString("yyyy-MM-dd") + "'"))

Вы написали метод, который заставит вас написать код, уязвимый для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк / интерполяцию / string.Format чтобы построить SQL-запрос. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

1 Ответов

Рейтинг:
2

Richard Deeming

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

protected void Select(object sender, EventArgs e)
{
    Button button = (Button)sender;
    string ID = button.CommandArgument;
    GridView gvOrders = (GridView)button.NamingContainer.FindControl("gvOrders");
    ...
Но убедитесь, что вы исправите свой GetData метод, чтобы вы могли правильно передать параметры запроса, чтобы избежать SQL-инъекция[^] уязвимость.