从 sql 数据源获取数据到 asp.net 控件中

Posted

技术标签:

【中文标题】从 sql 数据源获取数据到 asp.net 控件中【英文标题】:Get data from sql datasource into asp.net controls 【发布时间】:2010-11-24 08:52:04 【问题描述】:

我有一个带有非常简单的选择语句的 sqldatasource,它应该总是返回一行。我在页面上有文本框,我想用数据源中的数据填充这些文本框。我怎么能为文本框做到这一点?如果数据库中没有数据,那么我希望文本框保持为空。我怎样才能做到这一点?

<asp:Panel ID = "Panel2" runat="server" DefaultButton = "save" >
                        <fieldset style="width: 524px"><legend>Rouse InterChange Details</legend>
                        <asp:FormView runat="server" ID="MyFormView" DataSourceID="SqlDataSource3" DefaultMode="Edit">
                        <ItemTemplate >
                        <table>
                            <tr>
                                <td align="right">Interchange ID:</td>
                                <td align="left">
                                    <asp:TextBox ID="txtIntID" runat="server" size="1" MaxLength = "2" Text='<%# Bind("Interchange_Id") %>'></asp:TextBox>
                                    <asp:RequiredFieldValidator ID="RequiredFieldValidator8" ValidationGroup = "rouse"  Display ="None" ControlToValidate = "txtIntID" runat="server" ErrorMessage="You Must Provide an Interchange ID."> </asp:RequiredFieldValidator>
                                             <ajaxToolkit:ValidatorCalloutExtender ID="ValidatorCalloutExtender11" TargetControlID="RequiredFieldValidator8" HighlightCssClass="validatorCalloutHighlight" runat="server">
                                             </ajaxToolkit:ValidatorCalloutExtender>
                                </td>
                            </tr>
                            <tr>
                                <td align="right">Sender ID:</td>
                                <td align="left">
                                    <asp:TextBox ID="txtsender" runat="server" MaxLength = "15" ></asp:TextBox>
                                    <asp:RequiredFieldValidator ID="RequiredFieldValidator9" ValidationGroup = "rouse"  Display ="None" ControlToValidate = "txtsender" runat="server" ErrorMessage="You Must Provide a Sender ID."> </asp:RequiredFieldValidator>
                                     <ajaxToolkit:ValidatorCalloutExtender ID="vce12" TargetControlID="RequiredFieldValidator9" HighlightCssClass="validatorCalloutHighlight" runat="server">
                                     </ajaxToolkit:ValidatorCalloutExtender>
                                </td>
                            </tr>
                            <tr>
                                <td align="right">Interchange Standard ID:</td>
                                <td align="left">
                                    <asp:TextBox ID="ISI" runat="server" size="1" MaxLength = "1" ></asp:TextBox>
                                    <asp:RequiredFieldValidator ID="RequiredFieldValidator10" ValidationGroup = "rouse"  Display ="None" ControlToValidate = "ISI" runat="server" ErrorMessage="You Must Provide an Interchange Standard ID."> </asp:RequiredFieldValidator>
                                     <ajaxToolkit:ValidatorCalloutExtender ID="ValidatorCalloutExtender12" TargetControlID="RequiredFieldValidator10" HighlightCssClass="validatorCalloutHighlight" runat="server">
                                     </ajaxToolkit:ValidatorCalloutExtender>
                                </td>
                            </tr>
                            <tr>
                                <td align="right">Version:</td>
                                <td align="left">
                                    <asp:TextBox ID="Verstxt" runat="server" size="5" MaxLength = "5" ></asp:TextBox>
                                    <asp:RequiredFieldValidator ID="RequiredFieldValidator11" ValidationGroup = "rouse"  Display ="None" ControlToValidate = "Verstxt" runat="server" ErrorMessage="You Must Provide a Version."> </asp:RequiredFieldValidator>
                                     <ajaxToolkit:ValidatorCalloutExtender ID="ValidatorCalloutExtender13" TargetControlID="RequiredFieldValidator11" HighlightCssClass="validatorCalloutHighlight" runat="server">
                                     </ajaxToolkit:ValidatorCalloutExtender>
                                </td>
                            </tr>
                            <tr>
                                <td align="right">Functional ID:</td>
                                <td align="left">
                                    <asp:TextBox ID="FuncID" runat="server" size="1" MaxLength = "2" ></asp:TextBox>
                                    <asp:RequiredFieldValidator ID="RequiredFieldValidator12" ValidationGroup = "rouse"  Display ="None" ControlToValidate = "FuncID" runat="server" ErrorMessage="You Must Provide a Functional ID."> </asp:RequiredFieldValidator>
                                     <ajaxToolkit:ValidatorCalloutExtender ID="ValidatorCalloutExtender14" TargetControlID="RequiredFieldValidator12" HighlightCssClass="validatorCalloutHighlight" runat="server">
                                     </ajaxToolkit:ValidatorCalloutExtender>
                                </td>
                            </tr>
                            <tr style="display:none">
                                <td align="right">Group Control #</td>
                                <td align="left">
                                    <asp:TextBox ID="txtGroupcontrol" runat="server" size="6" MaxLength = "9" ></asp:TextBox>

                                </td>
                            </tr>
                        </table>
                        </ItemTemplate>
                        </asp:FormView>
                        <asp:SqlDataSource ID="SqlDataSource3" runat="server" 
                        ConnectionString="connectionstring" 
                        SelectCommand="select * from table1 "></asp:SqlDataSource>
                        </fieldset></asp:Panel>   

【问题讨论】:

【参考方案1】:

最简单的方法(我认为这样做)是在代码隐藏中编写所有数据访问和表单填充。但是,我有点困惑,您将其标记为 C# 和 VB.net。我将很快用一些 C# 示例代码更新这篇文章;在此期间,请随意开始评论垃圾邮件的问题。 :)

【讨论】:

我可以读写两种语言。使用 C# 标记的问题会得到更多关注 我知道如何通过手动连接和使用数据阅读器在代码中完成所有这些工作,但我想不这样做。 啊,好的!那我就不打扰示例代码了。在这种情况下,斯科特的答案就是要走的路。【参考方案2】:

您应该考虑使用 FormView 控件来执行此操作。使用绑定控件比试图将所有代码都塞进页面的代码隐藏中要容易和干净得多。我还觉得它使页面更易于维护,因为您无需管理所有 C#/VB 代码。

<asp:FormView runat="server" ID="MyFormView" DataSourceID="mysqlDataSource" DefaultMode="Edit">
    <EditItemTemplate>
        <table>
            <tr>
                <td align="right">Interchange ID:</td>
                <td align="left">
                    <asp:TextBox ID="txtIntID" runat="server" Text='<%# Bind("InterchangeID") %>' size="1" MaxLength = "2"></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidator8" ValidationGroup = "rouse"  Display ="None" ControlToValidate = "txtIntID" runat="server" ErrorMessage="You Must Provide an Interchange ID."></asp:RequiredFieldValidator>
                    <ajaxToolkit:ValidatorCalloutExtender ID="ValidatorCalloutExtender11" TargetControlID="RequiredFieldValidator8" HighlightCssClass="validatorCalloutHighlight" runat="server">                                             </ajaxToolkit:ValidatorCalloutExtender>
                </td>
            </tr>

        <!-- rest of your table here -->
        </table>
    </EditItemTemplate>
</asp:FormView>
<asp:SqlDataSource runat="server" ID="MySqlDataSource" 
    SelectCommand="SELECT * FROM MyTable" ConnectionString="<%$ ConnectionStrings:MyConnectionString %>" >
</asp:SqlDataSource>

查看这些链接了解更多信息:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.formview.aspx http://quickstarts.asp.net/QuickStartv20/aspnet/doc/ctrlref/data/formview.aspx

【讨论】:

我喜欢你用这个去哪里,但我不再看到我的文本框。我编辑了我的代码...你能看到我做错了什么吗? 别介意斯科特。我的问题是默认模式设置为“编辑”。知道为什么这是我的问题吗?我不想让它成为默认值吗? 抱歉 - 我没有想到 - 你想使用 EditItemTemplate 而不是 ItemTemplate。我会更新我的示例...【参考方案3】:

我喜欢在后面的代码中使用它:

GridView1.DataSource = getQuery(ConnectionString, "select * from mytable");
GridView1.DataBind();

 private DataTable getQuery(string ConnStr, string query)
    
        DataTable dt = new DataTable();

        try
        
            using (SqlConnection conn = new SqlConnection(ConnStr))  
            using (SqlDataAdapter cmd = new SqlDataAdapter(query, conn))


                cmd.Fill(dt);
        
        catch  
        return dt;
    

当然不是所有的细节都在这里

【讨论】:

我相信这就是我想要的。但我喜欢斯科特的想法。尽管如此 +1【参考方案4】:

我一直在 C# 中这样做,而不是从控件本身“默认”加载数据。这样我就知道当我的网页加载时,我控制的是数据加载,而不是 ASP!我下面的方法也很好地避免了生成连接器、数据集和其他控件,只是为了从一行中获取一条数据,例如从一张表中。

                SqlDataSource sdsClogdetails = (SqlDataSource)gvRow.FindControl("sdsCLdetails");
                if (sdsClogdetails != null)
                
                    DataView dv = sdsClogdetails.Select(DataSourceSelectArguments.Empty) as DataView;
                    if (dv != null)
                    
                        DataTable dt = dv.ToTable() as DataTable;
                        if (dt != null)
                        
                            DataRow dr = (DataRow)dt.Rows[0];
                            txtCLOG.Text = dr.ItemArray[3].ToString();
                        
                    
                

所以在我的示例中,我想要将数据放入的 ASP 控件称为txtCLOG,它是一个TextBox 控件。显然,数据位于数据集 3 个单元格内。因此,如果您的数据源返回 10 列数据,那么我的示例会将第 3 列的数据引入文本框控件。

使用上面的代码或类似代码,我可以用一块石头击中许多鸟,而且我也不必处理内存中保存的控件。当然,完成上述操作的更好方法是使用USING 语句。

【讨论】:

以上是关于从 sql 数据源获取数据到 asp.net 控件中的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net 控件如何从它们的数据源中读取数据?

将数据从 ASP.NET 页面传递到动态加载的 ASCX 用户控件

从 ASP.NET 中的 SQL Server 获取汇总/排序的数据

asp.net 2.0中GridView控件的怪怪问题

ASP.NET MVC:从 SQL Server Express 迁移到 Azure

asp.net怎样把数据库中字段的值绑定到dropdownlist上,