проблема с полями шаблона в сетке - PullRequest
0 голосов
/ 21 июля 2011

Q:

У меня следующая проблема, и я не знаю, как ее исправить.

У меня есть grid view, один из столбцов - template field как (текстовое поле). Вид сетки состоит из 8 строк. То, что я делаю, это каждый раз, когда пользователь вводит данные в текстовое поле, я помещаю итоговое значение в последнее текстовое поле (для которого установлено enabled = false). Я суммирую ввод данных в текстовые поля с помощью какого-либо метода и вызываю его в событии text changed. Но каждый раз, когда я вписываю число в текстовое поле и затем нажимаю Tab in the keyboard или использую курсор мыши для перехода к следующему полю, я теряю фокус, и мне приходится снова помещать курсор мыши в нужное текстовое поле.

Я пытаюсь решить эту проблему следующими способами, но тщетно.

 foreach (GridViewRow r in gv_Evaluation.Rows)
            {
                ((RadTextBox)r.Cells[3].FindControl("txt_evaluateWeights")).Attributes.Add("blur", "calc()");
            }

при загрузке моей страницы это вообще не работает.


protected void txt_evaluateWeights_TextChanged(object sender, EventArgs e)
{
    calc();
    ((TextBox)sender).Focus();
}

Таким способом можно вернуть фокус к предыдущему текстовому полю (я имею в виду то, что я уже сделал), а не к текстовому полю, в котором я хочу сфокусироваться, чтобы ввести данные.

EDIT:

Мой метод расчета:

private void calc()
        {
            float sum = 0;
            for (int i = 0; i < 7; i++)
            {
                RadTextBox txt1 = (RadTextBox)gv_Evaluation.Rows[i].Cells[3].FindControl("txt_evaluateWeights");
                int weight;
                bool result = Int32.TryParse(txt1.Text, out weight);
                if (result)
                {
                    sum += weight;
                }
            }

            double percentage;
            percentage = Math.Round((sum / 100) * 100, 2);
            RadTextBox txt3 = (RadTextBox)gv_Evaluation.Rows[7].Cells[3].FindControl("txt_evaluateWeights");
            txt3.Text = percentage.ToString();//string.Format("{0:0.0%}", percentage.ToString());

        }

1 Ответ

1 голос
/ 21 июля 2011

Выполнение этого с использованием сервера PostBack - ужасный способ сделать это.

Вместо этого используйте JavaScript.Вот небольшой пример в jQuery

GridView

<asp:GridView ID="DemoGrid" runat="server"
            AutoGenerateColumns="false"
            ShowFooter="true">
    <Columns>
        <asp:TemplateField HeaderText="index">
            <ItemTemplate><%# Container.DataItemIndex + 1 %></ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Item">
            <ItemTemplate>
                <asp:Label ID="DemoLabel" runat="server" Text='<%# Container.DataItem %>' />
            </ItemTemplate>
            <FooterTemplate>Total</FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Amount">
            <ItemTemplate>
                <asp:TextBox ID="DemoText" runat="server" CssClass="quantity">
                </asp:TextBox>
            </ItemTemplate>
            <FooterTemplate>
                <asp:Label ID="TotalLabel" runat="server" CssClass="result"/>
            </FooterTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Код позади

protected void Page_Load(object sender, EventArgs e){
    if (!IsPostBack)
    {
        string[] array = new string[] { "demo1", "demo2", "demo3", "demo4", "demo5" };
        DemoGrid.DataSource = array;
        DemoGrid.DataBind();
    }
}

JavaScript (jQuery)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $(".quantity").bind("blur", function () {
            var $quantity = $(this);
            var quantity = +$quantity.val(); //cast to number
            if (!isNaN(quantity)) {
                var $sum = $quantity.closest("table").find("tr:last .result");
                var sum = +$sum.html();
                $sum.html(sum + quantity);
            }
        });
    });
</script>

Надеюсь, это поможет

...