C# GridView получить ввод текстового поля - PullRequest
0 голосов
/ 08 июля 2020

У меня проблема, которая, скорее всего, проста, но мне не хватает чего-то небольшого.

Я просмотрел множество записей в Stack Overflow с тем же вопросом, но, должно быть, что-то делаю не так.

Я пытаюсь получить значение текстового поля в GridView после ввода в него. Я хочу взять это значение и обновить поле SQL.

Вот мой GridView:

<asp:GridView ID="ASPxGridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="SALESID" HeaderStyle-HorizontalAlign="CENTER" HorizontalAlign="CENTER" CellPadding="4" ForeColor="#333333" GridLines="Both" AllowSorting="true" AllowPaging="true" PageSize="100" OnRowDataBound="ASPxGridView1_RowDataBound" OnSorting="ASPxGridView1_Sorting" OnRowUpdating="ASPxGridView1_RowUpdating">
                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                    <Columns>
                        <%-- 0  This is e.Row.Cells[0].Text --%>
                        <asp:BoundField DataField="SALESID" HeaderText="SALES ORDER" SortExpression="SALESID" HeaderStyle-CssClass="padLeft" HeaderStyle-Width="125" ItemStyle-Width="115">
                            <HeaderStyle HorizontalAlign="Center"  />
                        <ItemStyle HorizontalAlign="Center" />
                        </asp:BoundField>
                           
                        <%-- 1 --%>
                        <asp:BoundField DataField="ITEMID" HeaderText="PART NUMBER" HeaderStyle-HorizontalAlign="Center" SortExpression="ITEMID" ItemStyle-Width="150" >
                        <ItemStyle HorizontalAlign="Center" />
                        </asp:BoundField>
                           
                        <%-- 2 --%>
                        <asp:BoundField DataField="NAME" HeaderText="PART NAME"  HeaderStyle-HorizontalAlign="Center" SortExpression="NAME" ItemStyle-Width="320">
                            <HeaderStyle HorizontalAlign="Center" />
                        <ItemStyle HorizontalAlign="Left" />
                        </asp:BoundField>
                            
                        <%-- 3 --%>
                        <asp:BoundField DataField="CUSTACCOUNT" HeaderText="ACC" HeaderStyle-HorizontalAlign="Center" SortExpression="CUSTACCOUNT">
                        <ItemStyle HorizontalAlign="Left" />
                        </asp:BoundField>
                            
                        <%-- 4 --%>
                        <asp:BoundField DataField="SALESNAME" HeaderText="CUSTOMER"  HeaderStyle-HorizontalAlign="Center" SortExpression="SALESNAME" ItemStyle-Width="350" >
                        <ItemStyle HorizontalAlign="Left" />
                        </asp:BoundField>
                           
                        <%-- 5 --%>
                        <asp:BoundField DataField="SHIPPINGDATECONFIRMED" HeaderText="SHIPPING DATE"  HeaderStyle-HorizontalAlign="Center" SortExpression="SHIPPINGDATECONFIRMED" ItemStyle-Width="100" >
                        <ItemStyle HorizontalAlign="Center" />
                        </asp:BoundField>
                            
                        <%-- 6 --%>
                        <asp:BoundField DataField="QTYORDERED" HeaderText="QTY ORDERED"  HeaderStyle-HorizontalAlign="Center" SortExpression="QTYORDERED" >
                        <ItemStyle HorizontalAlign="Center" />
                        </asp:BoundField>
                            
                        <%-- 7 --%>
                        <asp:BoundField DataField="REMAINSALESPHYSICAL" HeaderText="QUANTITY REMAINED"  HeaderStyle-HorizontalAlign="Center" SortExpression="REMAINSALESPHYSICAL" >
                        <ItemStyle HorizontalAlign="Center" />
                        </asp:BoundField>

                        <%-- 8 --%>
                        <asp:BoundField DataField="AVAILPHYSICAL" HeaderText="AVAIL PHYSICAL"  HeaderStyle-HorizontalAlign="Center" SortExpression="AVAILPHYSICAL" ItemStyle-Width="80" >
                        <ItemStyle HorizontalAlign="Center" />
                        </asp:BoundField>
                            
                        <%-- 9 --%>
                        <asp:HyperLinkField DataTextField="WMSLOCATIONID" HeaderText="LOCATION"  HeaderStyle-HorizontalAlign="Center" DataNavigateURLFields="ITEMID" DataNavigateURLFormatString="~\Location.aspx?ITEMID={0}" Target="_blank" SortExpression="WMSLOCATIONID">
                        <ItemStyle HorizontalAlign="Center" />
                        </asp:HyperLinkField>

                        <%-- 10 --%>
                        <asp:HyperLinkField DataTextField="INPROCESS" HeaderText="IN PROCESS"  HeaderStyle-HorizontalAlign="Center" DataNavigateUrlFields="ITEMID" DataNavigateUrlFormatString="~\InProcess.aspx?ITEMID={0}" Target="_blank" SortExpression="INPROCESS">
                        <ItemStyle HorizontalAlign="Left" /> 
                        </asp:HyperLinkField>

                        <%-- 11 --%>
                        <asp:BoundField DataField="PRD" HeaderText="PRD" HeaderStyle-HorizontalAlign="Center" SortExpression="PRD" ItemStyle-Width="135">
                            <ItemStyle HorizontalAlign="Center" />
                        </asp:BoundField>
                       
                         <%-- 12 --%>
                        <asp:TemplateField HeaderText="SHIPTODAY" ItemStyle-Width="90">
                            <ItemTemplate>
                                <asp:TextBox ID="SHIPTODAY" runat="server"></asp:TextBox>
                            </ItemTemplate>
                        </asp:TemplateField>

                        <%-- 13 --%>
                        <asp:TemplateField HeaderText="NOTES" >
                            <ItemTemplate>
                                <asp:TextBox ID="NOTES" runat="server" TextMode="MultiLine"></asp:TextBox>
                            </ItemTemplate>
                        </asp:TemplateField> 
                        
                        <asp:ButtonField ButtonType="Button" HeaderText="" CommandName="Update" Text="Update" />
                          
                        
                    </Columns>
                    <EditRowStyle BackColor="#999999" />
                    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <HeaderStyle BackColor="#284775" Font-Bold="True" ForeColor="White" HorizontalAlign="Center" />
                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="False" ForeColor="#333333" />
                    <SortedAscendingCellStyle BackColor="#E9E7E2" />
                    <SortedAscendingHeaderStyle BackColor="#506C8C" />
                    <SortedDescendingCellStyle BackColor="#FFFDF8" />
                    <SortedDescendingHeaderStyle BackColor="#6F8DAE" />
                </asp:GridView>

Вот мой метод gridview _RowUpdating:

  protected void ASPxGridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {

            Debug.WriteLine("row updating");
            int index = Convert.ToInt32(e.RowIndex);
            Debug.WriteLine("Index: " + index);
            GridViewRow selectedRow = ASPxGridView1.Rows[index];
            TableCell itemIDSelected = selectedRow.Cells[1];
            TableCell rowPRD = selectedRow.Cells[11];
            TableCell rowShipToday = selectedRow.Cells[12];
            TableCell rowNotes = selectedRow.Cells[13];
            string itemIdSelectedText = itemIDSelected.Text;
            string rowPRDSelected = rowPRD.Text;
            string rowShipTodaySelected = rowShipToday.Text;
            string test = ((TextBox)selectedRow.FindControl("NOTES")).Text;
            string test1 = ((TextBox)ASPxGridView1.Rows[index].FindControl("NOTES")).Text;
            TextBox test2 = ASPxGridView1.Rows[index].FindControl("NOTES") as TextBox;
            string test2text = test2.Text;
            //string rowNotesSelected = rowNotes.Text;
            //Debug.WriteLine(itemIdSelectedText);
            //Debug.WriteLine(itemIdSelectedText);
            //Debug.WriteLine(rowPRDSelected);
            //Debug.WriteLine(rowShipTodaySelected);
            Debug.WriteLine(test1);
            Debug.WriteLine(test);
            Debug.WriteLine(test2text);
            //Debug.WriteLine(selectedRow.Cells[0].Text);
            //Debug.WriteLine(selectedRow.Cells[1].Text);
            //Debug.WriteLine(selectedRow.Cells[2].Text);
            //Debug.WriteLine(selectedRow.Cells[3].Text);
            //Debug.WriteLine(selectedRow.Cells[4].Text);
            //Debug.WriteLine(selectedRow.Cells[5].Text);
            //Debug.WriteLine(selectedRow.Cells[6].Text);
            //Debug.WriteLine(selectedRow.Cells[7].Text);
            //Debug.WriteLine(selectedRow.Cells[8].Text);
            //Debug.WriteLine(selectedRow.Cells[9].Text);
            //Debug.WriteLine(selectedRow.Cells[10].Text);
            Debug.WriteLine(selectedRow.Cells[11].Text);
            //Debug.WriteLine(selectedRow.Cells[12].Text);
            //Debug.WriteLine(selectedRow.Cells[13].Text);
            Debug.WriteLine("-----------");
            //Debug.WriteLine(rowShipTodaySelected);
            //Debug.WriteLine(rowNotesSelected);
        }

Когда я запускаю это и что-то набираю, отображается строка записи отладки.

Я знаю, что нахожусь на правильной строке, потому что индекс правильный для строки, на которой я нажимаю кнопку «Обновить».

Пример вывода отладки, приведенный выше, выглядит следующим образом:

row updating
Index: 5
D31948P01
PRD-00030521




PRD-00030521

Кажется, я не могу получить значение поля NOTES TextBox. Как вы можете видеть при тестировании, я пробовал использовать FindControl, и я пробовал использовать его как TextBox, а также пытался получить его напрямую в строку.

Я устанавливал точки останова и каждый раз сделай это, переменная test будет null. Мне чего-то не хватает, и я не знаю что.

Подведем итог: в нетекстовых полях я могу извлечь данные из поля. В полях TextBox я даже не могу использовать метод FindControl.

Что я хочу сделать: получить значение поля TextBox в GridView, чтобы я мог обновить базу данных.

Ссылки StackOverflow, которые я пробовал прежде чем задать этот вопрос:
c# Получить значение (текст) связанного текстового поля в gridview
Как получить значение TextBox из GridView в C#?
Управление текстовым полем в gridview C#
Получить значение TextBox из ячейки GridView
ASP. net C# Поле кнопки Gridview onclick event

Заранее спасибо. Я потратил более 6 часов на попытки, но безрезультатно. Я еще недостаточно хорошо это понимаю. Если есть какие-либо учебные пособия или видеоролики, объясняющие GridView, сообщите мне, что это такое, чтобы я мог лучше понять.

1 Ответ

0 голосов
/ 08 июля 2020

Причина, по которой метод RowUpdating не может найти текст внутри текстового поля, скорее всего, из-за обратной передачи. Нажатие кнопки обновления вызывает отправку сообщения на сервер. Перед вызовом ASPxGridView1_RowUpdating выполняется вызов для восстановления gridview ie .: ASPxGridView1.DataBind () . Чтобы избежать этого, оберните привязку данных в if (!Page.IsPostBack)

Ниже приведен базовый c рабочий пример

<asp:GridView ID="ASPxGridView1" 
            runat="server" 
            AutoGenerateColumns="False" 
            OnRowUpdating="ASPxGridView1_RowUpdating">
            <Columns>         
                <asp:TemplateField HeaderText="NOTES" >
                    <ItemTemplate>
                        <asp:TextBox ID="NOTES" runat="server" TextMode="MultiLine"></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>                         
                <asp:ButtonField ButtonType="Button" HeaderText="" CommandName="Update" Text="Update" />                                                  
            </Columns>
        </asp:GridView>

Код позади:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // This code will not be reached if you click update button.
        var data = new string[] { "a", "b", "c" };
        ASPxGridView1.DataSource = data;
        ASPxGridView1.DataBind();
    }
}

protected void ASPxGridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    int index = Convert.ToInt32(e.RowIndex);
           
    GridViewRow selectedRow = ASPxGridView1.Rows[index];            
    TextBox txtNotes = (TextBox)selectedRow.FindControl("NOTES");
    Debug.WriteLine(txtNotes.Text);
}
...