Создание подкласса GridView, управляемого пользователем - PullRequest
4 голосов
/ 11 августа 2011

Я пытаюсь создать подкласс GridView, который находится в UserControl.Я хочу иметь возможность обрабатывать события на отдельной странице в результате этого.

В основном у меня есть следующий код:

Мой UserControl с GridView:

<%@ Control Language="C#" AutoEventWireup="false" CodeBehind="StdList.ascx.cs" Inherits="UCS_Web.uP.UserControls.StdList" %>
<div>
<asp:Panel ID="Panel1" runat="server">

<asp:GridView ID="_gridView" runat="server" PageSize="6" 
        GridLines="None" AutoGenerateColumns="False" 
        OnRowCommand="_gridView_RowCommand" AutoGenerateEditButton="false" 
        OnDataBound="_gridView_DataBound" OnPreRender="_gridView_PreRender">

        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" CssClass="gridViewHdr" />
        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />

    </asp:GridView>
</asp:Panel>

Страница, которая использует UserControl, будет выглядеть следующим образом:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="BypassReasonsPage.aspx.cs" Inherits="UCS_Web.uP.Tools.BypassReasonsPage" %>

<%@ Register Src="~/uP/UserControls/StdList.ascx" TagName="List" TagPrefix="uc" %>

<body>
<form id="form1" runat="server">
    <div>
        <uc:List ID="uc_list" runat="server" />
    </div>
</form>

Это код позади:

uc_list.GridView.DataSource = this.TCW.Copy.bypassReasons;
uc_list.GridView.DataBind();

Toчтобы эта страница работала, я включаю этот файл, который задает, какие столбцы связаны с данными и т. д.быть в CodeBehind пользовательского контроля.Как я могу сделать эту работу?

Я пытался сделать их виртуальными классами и переопределить их на страницах, на которых я их использую, но это не сработало.Любые другие методы, которые могли бы сделать это?)

namespace UCS_Web.uP.UserControls
{
public class MyStdList : StdList
{
    protected override void _gridView_RowCommand(object sender, GridViewCommandEventArgs e){
        Response.Redirect("HERPA DERP!");
    }
}

}

1 Ответ

5 голосов
/ 11 августа 2011

Ваш пользовательский элемент управления partial class верно?

См. Ключевое слово C # частичное :

Возможно разделить определение класса илиstruct, интерфейс или метод для двух или более исходных файлов.Каждый исходный файл содержит раздел определения типа или метода, и все части объединяются при компиляции приложения.

Это может выглядеть следующим образом

// MyOtherFile.cs:

namespace MyWebSite.UserControls
{
    public partial class MyUserControl : System.Web.UI.UserControl
    {
        protected override void OnInit(System.EventArgs e)
        {
            base.OnInit(e);

            _gridView.OnRowCommand += _gridBiew_RowCommand;
            _gridView.OnDataBound += _gridView_DataBound;
        }

        // events here...
    }
}

Чтобы переопределить вашметоды в подклассе, базовый класс StdList должен иметь virtual методы и / или свойства.

См. ключевое слово C # s virtual :

Ключевое слово virtual используется для изменения метода, свойства, индексатора или объявления события и позволяет переопределять его в производном классе.Например, этот метод может быть переопределен любым классом, который его наследует:

  namespace UCS_Web.uP.UserControls
  {
      public partial class StdList : UserControl
      {
          private ICustomTable m_custom = null;

      }

      protected virtual void _gridView_DataBound(object sender, EventArgs e)
      {
          if (_gridView.Rows.Count > 0)
          {
              for (int i = _gridView.Rows.Count + 1; i <= _gridView.PageSize - 1; i++)
              {
                  GridViewRow row = new GridViewRow(
                          0,
                          0,
                          DataControlRowType.DataRow,
                      //(i % 2 > 0) ? datacontrolrowstate.normal : datacontrolrowstate.alternate);
                          DataControlRowState.Alternate);

                  foreach (DataControlField field in _gridView.Columns)
                  {
                      TableCell cell = new TableCell();
                      cell.Text = "&nbsp;";
                      row.Cells.Add(cell);
                  }
            //row.Attributes.Add("OnClick", "javascript:alert();");
                  row.BackColor = System.Drawing.ColorTranslator.FromHtml("#ffffff");
                  _gridView.Controls[0].Controls.AddAt(i, row);
              }
          }
      }

      protected virtual void _gridView_RowCommand(object sender, GridViewCommandEventArgs e)
      {
              // I do nothing for now... A subclass could override me and do very nice stuff
      } 
  }

И ...

  namespace UCS_Web.uP.UserControls
  {
      public partial class SpecialStdList : StdList { }

      protected override void _gridView_RowCommand(object sender, GridViewCommandEventArgs e)
      {
          // I do very nice stuff
      } 
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...