2009-08-31 34 views
3

我有一个sqldatasource,它有一个非常简单的select语句,应该总是返回一行。我在我想用数据源中的数据填充的页面上有文本框。我怎么能这样做文本框?如果数据库中没有数据,那么我希望文本框保持空白。我怎样才能做到这一点?从sql数据源获取数据到asp.net控件

<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> 

回答

3

你应该考虑使用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> 

请参见以下链接了解更多信息:

+0

我喜欢你要去的地方,但我不再看到我的文本框。我编辑了我的代码...你能看到我做错了什么吗? – Eric 2009-08-31 14:54:18

+0

没关系斯科特。我的问题是默认模式被设置为'编辑'。任何想法为什么这是我的问题?我不希望它成为默认值吗? – Eric 2009-08-31 14:56:52

+0

对不起 - 我没有想到 - 你想使用EditItemTemplate而不是ItemTemplate。我会更新我的样本... – 2009-08-31 15:10:41

1

最简单的方法(即我认为要做到这一点),是写在代码隐藏所有的数据访问和形式的人口。不过,我有点困惑,你把它标记为C#和VB.net。我将稍后用一些C#示例代码更新这篇文章;在此期间随时开始评论 - 垃圾问题。 :)

+0

我可以用这两种语言读写。当用C#进行标记时,问题会受到更多的关注 – Eric 2009-08-31 14:31:06

+0

我知道如何在后面的代码中通过手动连接和使用数据读取器来完成所有这些操作,但是我希望没有这样做。 – Eric 2009-08-31 14:31:43

+0

啊,好的!然后我不会打扰示例代码。在那种情况下,斯科特的答案就是要走的路。 – 2009-08-31 14:37:46

1

我喜欢在代码中使用此背后:

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; 
    } 

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

+0

这我相信是我正在寻找。但我喜欢斯科特的想法。尽管如此+1 – Eric 2009-08-31 14:58:09

0

我一直在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列数据,那么我的示例会将第三列的数据引入到文本框控件中。

使用上面的代码或类似的命令,我可以用一块石头打出许多鸟,而且我也不必管理处理内存中的控件。当然,更好的方法是使用USING声明。