Колонка ASP.NET 2.0 Gridview CheckBox - PullRequest
       31

Колонка ASP.NET 2.0 Gridview CheckBox

1 голос
/ 10 сентября 2011

У меня есть GridView, который отображает данные в трех столбцах.На третьем столбце у меня есть CheckBox.У меня есть две вещи, которые мне нужно достичь

  1. CheckBox будет проверено на основе значения столбца (1,0)
  2. Если флажок установлен, остальные два столбцадолжен отображаться #### Однако данные для двух столбцов должны оставаться в базе данных.

Как этого достичь?

Могу ли я найти событие CheckBox on RowDataBound, проверить значение и сделать флажок CheckBox отмеченным и не отмеченным?Как насчет создания других столбцов ####?

NEW Комментарии:

string str = ((System.Data.DataRowView)(e.Row.DataItem)).Row.ItemArray[2].ToString();

это помогает установить флажок установлен или нет.

, если установлен флажок, япопробуйте следующее.

((System.Data.DataRowView)(e.Row.DataItem)).Row.ItemArray[0] = "#####";
((System.Data.DataRowView)(e.Row.DataItem)).Row.ItemArray[1] = "#####";
((System.Data.DataRowView)(e.Row.DataItem)).Row.AcceptChanges();

Отображается флажок gridview как установленный, но значение столбца не изменяется на "####"

1 Ответ

0 голосов
/ 10 сентября 2011

Вы можете превратить столбцы вашего элемента в TemplateColumns и выполнить следующие действия, которые локализуют ваш код до уровня управления, и вам не придется беспокоиться о поиске.Я предпочитаю никогда не использовать встроенные типы столбцов, потому что обычно есть будущие улучшения, которые в любом случае потребуют изменить столбцы на TemplateColumns.Это также дает вам большую гибкость при использовании.

Вот пример:

<asp:GridView ID="grdYourGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:TemplateField HeaderText="YourField1">
            <ItemTemplate>
                <asp:Literal runat="server" ID="ltYourField1" 
                    OnDataBinding="ltYourField1_DataBinding" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="YourField2">
            <ItemTemplate>
                <asp:Literal runat="server" ID="ltYourField2" 
                    OnDataBinding="ltYourField2_DataBinding" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="YourCheckBoxField">
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chkYourCheckBoxField" 
                    OnDataBinding="chkYourCheckBoxField_DataBinding" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

Затем в вашем коде позади реализуйте каждый элемент управления OnDataBinding:

protected void ltYourField1_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)(sender);
    lt.Text = (bool)(Eval("YourCheckBoxField")) ?
        "##########" : Eval("YourField1");
}

protected void ltYourField2_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)(sender);
    lt.Text = (bool)(Eval("YourCheckBoxField")) ?
        "##########" : Eval("YourField2");
}

protected void chkYourCheckBoxField_DataBinding(object sender, System.EventArgs e)
{
    CheckBox chk = (CheckBox)(sender);
    chk.Checked = (bool)(Eval("YourCheckBoxField"));
}

Преимущества такого подхода состоят в том, что вы можете легко заменить код, поскольку он изолирован и не имеет «поиска» ожидаемых элементов управления.Я очень редко использую событие RowDataBound, потому что оно заставляет вас писать конкретный код для поиска элементов управления, и для меня более логично иметь код, локализованный для элемента управления.Если кто-то что-то меняет, он знает, что это ТОЛЬКО влияет на этот элемент управления, а не на все элементы в строке, возможно, как побочный эффект.Вы также можете использовать метод <%# и сделать Eval прямо в разметке, но я лично предпочитаю, чтобы вообще не было никакого кода в разметке aspx.

...