Как проверить, проверен ли CheckBoxField в Gridview? - PullRequest
2 голосов
/ 22 февраля 2011

У меня есть веб-форма с GridView.В этом GridView у меня есть привязанный к базе данных CheckBoxField.У меня также есть поле с привязкой к данным, которое можно редактировать, с кодом состояния (order-statuscode).

Я хочу достичь следующего:

Если пользователь редактирует строку и проверяетфлажок, код состояния должен иметь новое назначенное значение, в случае, если пользователь забывает обновить код статуса.

ASP.Net:

<asp:GridView ID="gvRestordrer" runat="server" DataSourceID="basketConn2" AutoGenerateColumns="False" DataKeyNames="k_ordre_id" CssClass="gvBasket" GridLines="None" Width="706px" AllowPaging="true" PageSize="10" OnRowEditing="getOrderDetails" OnRowCancelingEdit="clearOrderDetails" OnRowUpdating="clearOrderDetails">
    <RowStyle CssClass="gvRow" />
    <Columns>
    ...
    // BoundField with statuscode. This value need to be updated on rowupdating, if Checkboxfield has been checked by the user
    <asp:BoundField DataField="k_order_statuscode" HeaderText="Statuscode" SortExpression="k_order_statuscode" >
        <HeaderStyle CssClass="gvHeader" />
    </asp:BoundField>
    // Checkboxfield bound to a database bool "k_order_completed"
    <asp:CheckBoxField DataField="k_order_completed" HeaderText="Completed?" SortExpression="k_order_completed" >
        <HeaderStyle CssClass="gvHeader" />
    </asp:CheckBoxField>
    // Commandfield
    <asp:CommandField DeleteText="" EditText="Handle Order" ShowDeleteButton="True" ShowEditButton="True" UpdateText="Update Order" >
        <HeaderStyle CssClass="gvHeader" />
    </asp:CommandField>
...
</asp:GridView>

C # stuff:

protected void clearOrderDetails(object sender, GridViewUpdateEventArgs e)
    {
        lblOrdreDetaljer.Text = "";
        int index = Convert.ToInt32(e.RowIndex);

        // Not working
        if (gvRestordrer.Rows[index].Cells[4].Value == true)
        {
            basketConn2.UpdateParameters["k_order_statuscode"].DefaultValue = "4";
        }
    }

Есть ли другие решения, кроме создания TemplateField и использования флажка внутри этого?Я полагаю, что должен быть более простой способ, но Google не дает мне ответа.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 10 августа 2011

Это может не работать для флажка с привязкой к данным, но вот как я это сделал для флажков в виде сетки.

До сих пор я был в состоянии получить проверенные предметы через:

Флажки добавляются в сетку:

 internal static void AddCheckboxes(System.Web.UI.WebControls.GridView gv,IEnumerable<int> checkedRows)
    {
        foreach (var item in gv.Rows.Cast<System.Web.UI.WebControls.GridViewRow>().Select(c => c.Cells[0]).Where(cell => cell.Controls.Count == 0).WithIndex())
            item.Item1.Controls.Add(new System.Web.UI.WebControls.CheckBox() { ClientIDMode = System.Web.UI.ClientIDMode.Static, ID = "ckUpdate" + item.Item2, Checked = checkedRows != null && checkedRows.Contains(item.Item2) });
    }

тогда в постбеке использую

 internal static IEnumerable<int> GetCheckedRows(IEnumerable<string> paramKeys)
    {
        return paramKeys
            .Where(f => f.Contains("$"))
            .Where(f => System.Text.RegularExpressions.Regex.IsMatch(f, "ckUpdate[0-9]+$"))
            .Select(p => int.Parse(System.Text.RegularExpressions.Regex.Match(p, "[0-9]+$").Value));

    }

затем звоните

 GetCheckedRows(Request.Params.AllKeys).ToList();

помощник:

public static IEnumerable<Tuple<T, int>> WithIndex<T>(this IEnumerable<T> enumerable)
    {
        return enumerable.Select((item, index) => Tuple.Create(item, index));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...