Как разделить разные текстовые поля в элементе управления? - PullRequest
0 голосов
/ 29 октября 2011

У меня есть три Textboxes, которые я не знаю, как отделить друг от друга, чтобы получить правильное значение.Я создаю Textboxes в GetTrix();, и когда я пытаюсь обновить значение , значения неверны, потому что между ними нет никакой разницы.

    protected void btnUpdate_Click(object sender, EventArgs e)
{
    string TrixName = null;
    string TrixID = null;
    string Hardness = null;
    string Webpage = null;

    foreach (Control c in phdTrix.Controls)
    {
        if (c.GetType() == typeof(TextBox))
        {
            //This is where there is no difference between the textboxes

            TrixName = (c as TextBox).Text;
            TrixID = (c as TextBox).ID;
            Hardness = (c as TextBox).Text;
            Webpage = (c as TextBox).Text;

            UpdateTrix(TrixID, TrixName, Hardness, Webpage);
        }
    }
}

private void GetTrix()
{
    DataTable table = CategoryAccess.GetAllTrix();

    for (int i = 0; i < table.Rows.Count; i++)
    {
        TextBox textbox = new TextBox();
        textbox.ID = table.Rows[i]["TrixID"].ToString();
        textbox.Text = table.Rows[i]["TrixName"].ToString();

        Literal literal1 = new Literal();
        literal1.Text = "<p>";

        TextBox textbox2 = new TextBox();
        textbox2.Text = table.Rows[i]["Hardness"].ToString();

        TextBox textbox3 = new TextBox();
        textbox3.Text = table.Rows[i]["Webpage"].ToString();

        Literal literal2 = new Literal();
        literal2.Text = "</p>";

        phdTrix.Controls.Add(literal1);
        phdTrix.Controls.Add(textbox);
        phdTrix.Controls.Add(textbox2);
        phdTrix.Controls.Add(textbox3);
        phdTrix.Controls.Add(literal2);
    }
}

Это было бы логичным решением.Но не работает.

TrixName = (c as TextBox textbox).Text; 
Hardness = (c as TextBox textbox2).Text;
Webpage = (c as TextBox textbox3).Text;

Новый код:

    protected void btnUpdate_Click(object sender, EventArgs e)
{
    string TrixID = null;
    string TrixName = null;
    string Hardness = null;
    string Webpage = null;

    foreach (Control c in phdTrix.Controls)
    {
        if (c.GetType() == typeof(TextBox))
        {
            TrixID = (c as Literal).Text;

            switch (c.ID)
            {

                case "TrixName":
                    TrixName = (c as TextBox).Text;
                    break;
                case "Hardness":
                    Hardness = (c as TextBox).Text;
                    break;
                case "Webpage":
                    Webpage = (c as TextBox).Text;
                    break;
            }

            UpdateTrix(TrixID, TrixName, Hardness, Webpage);
        }
    }
}



private void GetTrix()
{
    DataTable table = CategoryAccess.GetAllTrix();

    for (int i = 0; i < table.Rows.Count; i++)
    {
        Literal literalTrixID = new Literal();
        literalTrixID.Text = table.Rows[i]["TrixID"].ToString();
        literalTrixID.Visible = false;

        TextBox textbox = new TextBox();
        textbox.ID = "TrixName";
        textbox.Text = table.Rows[i]["TrixName"].ToString();

        Literal literal1 = new Literal();
        literal1.Text = "<p>";

        TextBox textbox2 = new TextBox();
        textbox2.ID = "Hardness";
        textbox2.Text = table.Rows[i]["Hardness"].ToString();

        TextBox textbox3 = new TextBox();
        textbox3.ID = "Webpage";
        textbox3.Text = table.Rows[i]["Webpage"].ToString();

        Literal literal2 = new Literal();
        literal2.Text = "</p>";

        phdTrix.Controls.Add(literalTrixID);
        phdTrix.Controls.Add(literal1);
        phdTrix.Controls.Add(textbox);
        phdTrix.Controls.Add(textbox2);
        phdTrix.Controls.Add(textbox3);
        phdTrix.Controls.Add(literal2);
    }
}

Я получаю сообщение об ошибке: найдено несколько элементов управления с одинаковым идентификатором (TrixName).FindControl должен иметь уникальный идентификатор.

1 Ответ

4 голосов
/ 29 октября 2011

Ну, не будет.

Вы перебираете элементы управления foreach (Control c in phdTrix.Controls) и каждый раз, когда вы находите текстовое поле, в котором вы делаете следующее:

        TrixName = (c as TextBox).Text;
        Hardness = (c as TextBox).Text;
        Webpage = (c as TextBox).Text;

Это назначит одно и то же текстовое поле каждой переменной.

Самое простое решение - назначить уникальный идентификатор каждому текстовому полю при его создании, а затем использовать его, чтобы определить, какой из них вы хотите. Вы можете использовать свойство ID. Тогда вы можете получить что-то вроде этого:

string TrixName = null;
string Hardness = null;
string Webpage = null;

foreach (Control c in phdTrix.Controls)
{
    if (c.GetType() == typeof(TextBox))
    {
        switch (c.ID)
        {
            case "TrixName":
                TrixName = (c as TextBox).Text;
                break;
            case "Hardness":
                Hardness = (c as TextBox).Text;
                break;
            case "Webpage":
                Webpage = (c as TextBox).Text;
                break;
        }

        UpdateTrix(TrixID, TrixName, Hardness, Webpage);
    }
}

Ваш код создания должен быть:

    TextBox textbox = new TextBox();
    textbox.ID = "TrixName";
    textbox.Text = table.Rows[i]["TrixName"].ToString();

    TextBox textbox2 = new TextBox();
    textbox2.ID = "Hardness";
    textbox2.Text = table.Rows[i]["Hardness"].ToString();

    TextBox textbox3 = new TextBox();
    textbox3.ID = "Webpage";
    textbox3.Text = table.Rows[i]["Webpage"].ToString();

Вам понадобится другой способ хранения TrixID, так как вы должны иметь детерминистический способ идентификации элементов управления, когда вы приходите, чтобы прочитать данные.

Однако, если у вас есть несколько групп этих элементов управления на странице, это не сработает, поскольку каждый идентификатор должен быть уникальным. В этом случае вам нужно добавить уникальный идентификатор (GUID) к элементам управления при их создании:

textbox.ID = "TrixName_" + Guid.NewGuid().ToString();

затем, когда вы хотите найти элемент управления, используйте string.Split() для удаления GUID:

string[] nameParts = c.ID.Split('_');
switch (nameParts[0])
{
    .... as before.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...