Вы можете превратить столбцы вашего элемента в 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.