使用 C# 创建与数据库值相关的动态文本框

Posted

技术标签:

【中文标题】使用 C# 创建与数据库值相关的动态文本框【英文标题】:CREATING DYNAMIC TEXTBOXES IN RELATION TO DATABASE VALUES with C# 【发布时间】:2021-03-27 01:10:49 【问题描述】:

我正在从数据库表中选择我的测试,我想在每个测试前创建一个文本框,用户将在其中输入每个测试的结果,并能够保存每个测试的结果 .我得到的错误信息是

“索引超出了数组的边界”

      int tindex=0;
                TextBox[] rst = new TextBox[tindex];

                try
                
                    while (sub.Read())
                    
                       
                        tindex++;
                        Label tst = new Label();
                        tst.Location = new Point(1, startingpoint);
                        tst.Name = "textBoxf";
                        tst.Size = new Size(200, 18);
                        tst.BorderStyle = BorderStyle.None;
                        tst.BackColor = SystemColors.Control;
                        tst.Text += sub.GetString("abbrev");

                       
                        try
                        


                            rst[tindex] = new TextBox();
                            rst[tindex].Location = new Point(120, startingpoint);
                            rst[tindex].Name = "textBoxf";
                            rst[tindex].Size = new Size(70, 12);
                            rst[tindex].BorderStyle = BorderStyle.None;
                            rst[tindex].BackColor = SystemColors.Control;
                            rst[tindex].TabIndex = tindex;
                            rst[tindex].TextChanged += rst_textchanged;
                            rst[tindex].KeyDown += rst_KeyDown;
                            TextBox rsts = rst[tindex];
                           

                            panel7.Controls.Add(rst[tindex]);

                        
                        catch(Exception er)
                        
                            MessageBox.Show(er.Message);
                        

I want a result like the one in the image. I can achieve this by just creating the textbox in a loop without the use of arrays, but it became hard to read from them the textbox since it's looping as one textbox

【问题讨论】:

提示:您认为要写入的新数组的第一个索引是什么? 提示 2:int tindex=0; TextBox[] rst = new TextBox[tindex];...看看这段代码。它创建的数组有多大? 目前还不清楚为什么在这里需要一个数组,因为您在创建后立即将每个文本框添加到面板中。您以后需要该数组来做其他事情吗? 【参考方案1】:

你的问题在这里:

int tindex=0;
TextBox[] rst = new TextBox[tindex];

您创建了一个可以容纳 0 个条目的空数组,因为 tIndex 为 0。

然后你甚至增加这个数字,使其第一个循环为 1

tindex++;

然后您访问当前索引为 1 的数组。请记住,该数组仍然可以容纳 0 个项目。这就是引发异常的地方。要翻译异常文本:您的数组边界是 0,而 1 在这些边界之外。

rst[tindex] = new TextBox();

看起来你甚至不需要第一个数组。至少不在你的剪报中。所以我建议删除它。

而不是:

                        rst[tindex] = new TextBox();
                        rst[tindex].Location = new Point(120, startingpoint);
                        rst[tindex].Name = "textBoxf";
                        rst[tindex].Size = new Size(70, 12);
                        rst[tindex].BorderStyle = BorderStyle.None;
                        rst[tindex].BackColor = SystemColors.Control;
                        rst[tindex].TabIndex = tindex;
                        rst[tindex].TextChanged += rst_textchanged;
                        rst[tindex].KeyDown += rst_KeyDown;
                        TextBox rsts = rst[tindex];
                       

                        panel7.Controls.Add(rst[tindex]);

你做这样的事情:

TextBox newBox = new TextBox();
newBox.Location = new Point(120, startingpoint);
newBox.Name = "textBoxf";
newBox.Size = new Size(70, 12);
newBox.BorderStyle = BorderStyle.None;
newBox.BackColor = SystemColors.Control;
newBox.TabIndex = tindex;
newBox.TextChanged += rst_textchanged;
newBox.KeyDown += rst_KeyDown;

panel7.Controls.Add(newBox);

如果你确实需要一个数组,我建议你使用一个列表:

List<TextBox> textBoxes = new List<TextBox>();

try

    while (sub.Read())
    
        Label tst = new Label();
        tst.Location = new Point(1, startingpoint);
        tst.Name = "textBoxf";
        tst.Size = new Size(200, 18);
        tst.BorderStyle = BorderStyle.None;
        tst.BackColor = SystemColors.Control;
        tst.Text += sub.GetString("abbrev");

       
        try
        
            TextBox newBox = new TextBox();

            newBox.Location = new Point(120, startingpoint);
            newBox.Name = "textBoxf";
            newBox.Size = new Size(70, 12);
            newBox.BorderStyle = BorderStyle.None;
            newBox.BackColor = SystemColors.Control;
            newBox.TabIndex = tindex;
            newBox.TextChanged += rst_textchanged;
            newBox.KeyDown += rst_KeyDown;

            // Add the new textbox to list
            textBoxes.Add(newBox);
            
            // Also add it to the panel controls
            panel7.Controls.Add(newBox);

        
        catch(Exception er)
        
            MessageBox.Show(er.Message);
        

【讨论】:

感谢 AdrAs。这帮助我发现了我的错误。

以上是关于使用 C# 创建与数据库值相关的动态文本框的主要内容,如果未能解决你的问题,请参考以下文章

链接动态创建的文本框和标签

比较用于过滤数据表c#的文本框

在 c# 中使用 javascript 日历设置值后如何获取文本框的文本?

在 c# 中使用文本框中的数据库值打开特定的 Windows 窗体

如何动态更改 C# 组合框或文本框中的自动完成条目?

在 MS Access 中,创建动态查询后,如何使用记录集中的相应值更新表单上的文本框?