Ввод значений в базу данных из «неограниченных» динамических элементов управления - PullRequest
0 голосов
/ 06 мая 2009

В раскрывающемся списке 1-10 пользователь выбирает желаемое количество текстовых полей - если он выбирает неограниченное количество, он показывает ему текстовое поле, в котором он вводит точное количество текстовых полей, которые он хочет. если он вводит 40, он показывает ему 40 текстовых полей, которые создаются во время выполнения.

Мой вопрос заключается в том, как мне ввести данные из 40 - или «любого числа, которое он вводит» в базу данных MS SQL. Нет никакого способа, которым я мог бы динамически создать имя столбца, и это было бы слишком утомительно и грязно. Есть ли способ, которым я могу это сделать?

Ответы [ 4 ]

3 голосов
/ 06 мая 2009

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

Например:

/// <Summary>
///  This would be fired when the user enters the number of textboxes
///  the want and click the 'Create Textboxes' button.
/// </Summary>
protected void CreateTextBoxes_Click(object sender, EventArgs e)
{
    // Check how many textboxes the user wants
    int count = Convert.ToInt32(CountTextBox.Text);

    // Generate the number of textboxes requested
    // and add them to the page
    for (int i=0; i < count; i++)
    {
        // Create the textbox
        TextBox textbox = new Textbox();

        // Set the ID so we can access it later
        textbox.ID = "TextBox_" + i;

        // Add the textbox to the panel
        TextBoxPanel.Controls.Add(textbox);
    }
}

/// <Summary>
///  This would be fired when the user has entered values in the textboxes
///  and clicked the Save button to save the values to the database.
/// </Summary>
protected void SaveButton_Click(object sender, EventArgs e)
{
    // Check how many textboxes the user created
    int count = Convert.ToInt32(CountTextBox.Text);

    // Loop through them
    for (int i=0; i < count; i++)
    {
         // Get the TextBox
         TextBox textbox = (TextBox) FindControl("TextBox_" + i);

         // Get the value
         string val = textbox.Text;

         // Insert into DB
         SaveValueToDatabase(val);
    }
]
1 голос
/ 06 мая 2009

Рассматривали ли вы сохранение данных в виде поля XML в базе данных?

Если у вас есть 40+ текстовых полей, вы можете просто иметь простую схему их хранения, например:

<YourData>
    <TextBox ID="TextBox1">Value1</TextBox>
    <TextBox ID="TextBox2">Value2</TextBox>
    <TextBox ID="TextBox3">Value3</TextBox>
    ... etc ...
</YourData>

Нет необходимости в динамических полях в вашей БД. Вы также должны хранить схему где-нибудь. Это хороший способ хранения динамических данных, которые могут меняться от записи к записи.

1 голос
/ 06 мая 2009

То, что у вас есть, это отношение «один ко многим» между тем, что есть на этой странице, и комментариями, описаниями или чем-то еще. Это не должно быть смоделировано в вашей базе данных как text_box_1, text_box_2 и т. Д. Вместо этого оно должно быть:

CREATE TABLE Some_Entity
(
    some_entity_id  INT NOT NULL,
    CONSTRAINT PK_Some_Entity PRIMARY KEY CLUSTERED (some_entity_id)
)
GO

CREATE TABLE Some_Entity_Comments
(
    some_entity_id  INT     NOT NULL,
    comment_number  INT     NOT NULL,
    comments        VARCHAR(1000)   NOT NULL,
    CONSTRAINT PK_Some_Entity_Comments
         PRIMARY KEY CLUSTERED (some_entity_id, comment_number),
    CONSTRAINT FK_Some_Entity_Comments_Some_Entity
         FOREIGN KEY (some_entity_id) REFERENCES Some_Entity (some_entity_id)
)
GO

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

0 голосов
/ 06 мая 2009

Мун, это дает мне ошибку "Ссылка на объект не установлена" в этой строке:

// Get the value
 string val = textbox.Text;

похоже, что он не может найти контроль над текстовым полем.

...