Почему событие щелчка составного элемента управления не запускается? - PullRequest
0 голосов
/ 23 января 2019

я написал составной элемент управления asp.net с именем (WebDbConnection) для управления строкой подключения моей базы данных. я добавил кнопку «btnConnect» и создал для нее событие click в методе «CreateChildControls».

   public WebDbConnection(string extraParameters, string configConnectionName, string databaseName,
        bool showDbName, string dialogName, bool isEncrypted,ref Page page)
    {
        _currentPage = page;
        _extraParameters = extraParameters;
        _dialogName = dialogName;
        IsEncrypted = isEncrypted;
        _showDbName = showDbName;

        _configConnectionName = configConnectionName;
        LoadDefaultConnectionString(IsEncrypted);

        _databaseName = databaseName;


    }
protected void BtnConnect_Click(object sender, EventArgs e)
    {
        try
        {
            EnsureChildControls();
            _server = Dbconnection_txtServer.Text;
            _userName = Dbconnection_txtUser.Text;
            _password = Dbconnection_txtPass.Text;
            _databaseName = Dbconnection_txtdbname.Text;

            if (Connection.State == ConnectionState.Connecting)
                return;

            Connect();
            if (Connection.State == ConnectionState.Open)
                this.Controls.Clear();
            else
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alertbox",
                    "alert('Can not connect to server.')", true);

                Dbconnection_txtServer.Text = _server;
                Dbconnection_txtUser.Text = _userName;
                Dbconnection_txtPass.Text = _password;
                Dbconnection_txtdbname.Text = _databaseName;
            }

        }

        catch (Exception ex)
        {
            LastError = ex.Message;
            LoadDefaultConnectionString(IsEncrypted);
            Dbconnection_txtServer.Text = _server;
            Dbconnection_txtPass.Text = _password;
            Dbconnection_txtUser.Text = _userName;
        }
    }    
    protected override void CreateChildControls()
    {
        Controls.Clear();

        lbl_HeaderName = new Label();
        lbl_HeaderName.ID = "lbl_HeaderName";
        lbl_HeaderName.Text = "Server Credential";

        lbl_servername = new Label();
        lbl_servername.ID = "lbl_servername";
        lbl_servername.Text = "Server Name";

        Dbconnection_txtServer = new TextBox();
        Dbconnection_txtServer.ID = "Dbconnection_txtServer";

        lbl_username = new Label();
        lbl_username.ID = "lbl_username";
        lbl_username.Text = "User Name:";

        Dbconnection_txtUser = new TextBox();
        Dbconnection_txtUser.ID = "Dbconnection_txtUser";

        lbl_password = new Label();
        lbl_password.ID = "lbl_password";
        lbl_password.Text = "Password:";

        Dbconnection_txtPass = new TextBox();
        Dbconnection_txtPass.ID = "Dbconnection_txtPass";

        lbl_databasename = new Label();
        lbl_databasename.ID = "lbl_databasename";
        lbl_databasename.Text = "Database Name:";

        Dbconnection_txtdbname = new TextBox();
        Dbconnection_txtdbname.ID = "Dbconnection_txtdbname";

        btnConnect = new Button();
        btnConnect.ID = "btnConnect";
        btnConnect.Text = "Connect";
        btnConnect.Click += BtnConnect_Click;

        btnCancel = new Button();
        btnCancel.ID = "btnCancel";
        btnCancel.Text = "Cancel";
        btnCancel.Click += BtnCancel_Click;


        //add controls
        Controls.Add(lbl_password);
        Controls.Add(lbl_databasename);
        Controls.Add(lbl_servername);
        Controls.Add(lbl_username);
        Controls.Add(lbl_HeaderName);
        Controls.Add(Dbconnection_txtdbname);
        Controls.Add(Dbconnection_txtPass);
        Controls.Add(Dbconnection_txtServer);
        Controls.Add(Dbconnection_txtUser);
        Controls.Add(btnConnect);
        Controls.Add(btnCancel);
    } 
void ShowPage()
    {
        EnsureChildControls();
        if (!_currentPage.Form.Controls.Contains(this))
            _currentPage.Form.Controls.Add(this);
        else
        {
            _currentPage.Form.Controls.Remove(this);
            _currentPage.Form.Controls.Add(this);
        }

        Dbconnection_txtdbname.Text = _databaseName;
        if (!_showDbName)
        {
            lbl_databasename.Visible = false;
            Dbconnection_txtdbname.Visible = false;
        }

        //----------------------
        if (_dialogName.IsEmptyOrNull()) return;
        lbl_HeaderName.Text = "Fill " + _dialogName + " Information";
    }

Идея состоит в том, чтобы показать составное управление, когда я вызываю метод «ShowPage» внутри. проблема в том, что когда я создаю составной элемент управления на других страницах, «ShowPage» работает правильно, но на обратных передачах событие щелчка «BtnConnect» не запускается, и возникает только форма обратной передачи !!!

в течение пары часов я обнаружил, что когда я добавляю экземпляр класса WebDbConnection для формирования элементов управления в событии page_load, мой элемент управления работает нормально.

protected void Page_Load(object sender, EventArgs e)
{
    Page.Form.Controls.Add(WebDbConnection_instance);
}

но как это сделать, добавив элементы управления внутри моего элемента управления, а не на событие page_load клиента?

1 Ответ

0 голосов
/ 03 февраля 2019

после 10 дней поиска и проверки некоторых подходов я нашел решение перехватить мой код за объектами класса и отправкой пользователям тегов HTML.поэтому вместо использования составного элемента управления я использую HTTPModule «myModule1», чтобы перехватить запрос Ajax, а затем создать нужные мне теги HTML и отправить их пользователям.см. этот пост для деталей: Как найти и заменить requestContext.Response в IHttpModule?

Кошмар не закончен !!!после вышеупомянутого подхода вы должны зарегистрировать HTTPModule в файле web.config (тег <system.webserver>), поэтому я хочу динамически регистрировать «myModule1» всякий раз, когда это необходимо.чтобы достичь этого, я использую директиву ниже в верхней части класса «myModule1».

[assembly: PreApplicationStartMethod(typeof(DreamyTools.DataBase.Web.MyModule1), "Initialize")]
 namespace DataBase.Web
  {
   public class MyModule1 : IHttpModule
   {
     public static void Initialize()
      {
           Microsoft.Web.Infrastructure.DynamicModuleHelper
           .DynamicModuleUtility.RegisterModule(MyModule1);
       }

, поэтому при каждой ссылке на этот объект вызывается метод «Initialize» и происходит регистрация в web.config.

Я надеюсь, что этот подход был полезен для разработчиков для создания вызовов Ajax и получения запросов в собственных SDK.

...