【问题标题】:C# Binding multiple textboxes to databaseC#将多个文本框绑定到数据库
【发布时间】:2009-10-02 13:05:55
【问题描述】:

我正在尝试将 3 个文本框绑定到一个类,该类检索 3 个文本框中每一个的任何先前存储的记录。我不知道如何从面向对象的角度从一个类中检索 3 个不同的值。我知道如何返回单个字符串、布尔值等变量,但一次不超过 1 个。

我使用的简单 bool 返回方法示例,如何调整它以返回 3 个单独的字符串变量 - 代码片段:

public static Boolean isQuestionnaireComplete(string strHash)
        {
            SqlConnection con = Sql.getConnection();

            try
            {
                SqlCommand cmd = new SqlCommand("SELECT IsComplete FROM UserDetails WHERE Hash='" + strHash + "' AND IsComplete=1");
                cmd.Connection = con;
                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                con.Open();
                da.Fill(dt);
                if (dt.Rows.Count == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch
            {
                //TODO:log error
                return false;
            }
            finally
            {
                con.Close();
            }
        }

ASPX 代码段:

<asp:TextBox runat="server" ID="txt1" Height="200px" Width="600px"></asp:TextBox>
<asp:TextBox runat="server" ID="txt2" Height="200px" Width="600px"></asp:TextBox>
<asp:TextBox runat="server" ID="txt3" Height="200px" Width="600px"></asp:TextBox>

【问题讨论】:

    标签: c# asp.net textbox oop


    【解决方案1】:

    您需要使用 3 个值返回您自己的结构。你可以做一个数组,但你必须确保你知道数组中的哪个项目与你没有的数据结构的文本框匹配,记住 [0] == 第一个文本框,你可以使用友好的名称更具可读性和更易于维护。

    public static MyDataStructure isQuestionnaireComplete(string strHash)
    {
        SqlConnection con = Sql.getConnection();
    
        try
        {
            SqlCommand cmd = new SqlCommand("SELECT IsComplete, FirstString, SecondString, ThridString FROM UserDetails WHERE Hash='" + strHash + "' AND IsComplete=1");
            cmd.Connection = con;
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            con.Open();
            da.Fill(dt);
    
            if (dt.Rows.Count == 0)
            {
                return null;
            }
            else
            {
                // Populate object from data table
                DataRow row = dt.Rows[0];
    
                retun new MyDataStructure
                  {
                    MyFirstString = row["FirstString"],
                    MySecondString = row["SecondString"],
                    MyThirdString = row["ThridString"]
                  };
            }
        }
        catch
        {
            //TODO:log error
            return false;
        }
        finally
        {
            con.Close();
        }
    }
    
    public class MyDataStructure
    {
      public string MyFirstString { get; set; }
      public string MySecondString { get; set; }
      public string MyThirdString { get; set; }
    }
    

    【讨论】:

    • 谢谢,我喜欢这种方式,现在就试一试。也喜欢 public 的拼写错误:)
    • 刚试了一下,每个 Gets 和 Sets 都有一点问题:错误 1 ​​'Package.Sql.Sql.Comments.MyFirstComment.get' 必须声明一个主体,因为它没有标记为抽象或外部
    • 公共字符串 MyFirstString { get;放; } 适用于 .NET 3.5,如果您使用的是 .NET 2.0 或 .NET 1.1,则必须声明一个私有成员,然后执行 get 和 set。
    • 是的,我正在使用它的 2.0。我需要在公共类 MyDataStructure {} 中还是在外部对获取和集进行编码?再次感谢
    【解决方案2】:

    将字符串存储在数据集或数据读取器中,然后将它们传递回适当的层。

    【讨论】:

      【解决方案3】:

      你要返回什么?

      public static string[] ReturnStringArrayMethod()
      {
           string[] arrStr = new string[3]();
           arrStr[0] = "first string";
           arrStr[1] = "second string";
           arrStr[2] = "third string";
           return arrStr;
      }
      

      你可以用和类型做同样的事情,例如 bool[]、int[] 等 然后,您使用

      从返回值访问项目
      string val = arrStr[0];
      

      【讨论】:

      • 他处理的是数据库而不是数组中的静态数据。
      • 我只是展示了如何构建返回值。他的代码 sn-p 没有向我们展示他想要返回的内容。他只是说“我如何调整它以返回 3 个单独的字符串变量”。什么字符串变量?
      • 如果字符串本身可能有 1000 个字符长,那么使用数组存储字符串是否安全?它们将作为 varchars(max) 存储在数据库中,因此相当长。
      • 是的,但更好的方法是将您的 dt 映射到一个类,并将字符串作为类的属性,就像在 David Basarab 的回答中一样。
      【解决方案4】:

      我想以此作为开头,我不太清楚您要做什么。问卷总是3个问题吗?还是大小是动态的?

      如果大小是动态的(这是我提供的示例),我将使用 Repeater,如果大小固定为 3,我将使用 FormView

      使用以下代码访问数据库:

      namespace BLL
      {
          using System;
          using System.Data;
          using System.Data.SqlClient;
          [System.ComponentModel.DataObject]
          public class QuestionnaireDataObject
          {
              public static DataTable isQuestionnaireComplete(string strHash1, string strHash2, string strHash3)
              {
                  DataTable dt = new DataTable();
                  using (SqlConnection con = Sql.getConnection())
                  {
                      SqlCommand cmd =
                          new SqlCommand(
                              String.Format("SELECT Hash, IsComplete FROM UserDetails WHERE Hash IN ('{0}', '{1}', '{2}')",
                                            strHash1, strHash2, strHash3));
                      SqlDataAdapter da = new SqlDataAdapter(cmd);
                      da.Fill(dt);
                      da.Dispose();
                  }
      
                  return dt;
              }
          }
      }
      

      在您后面的代码中,您将需要以下内容:

      <asp:Repeater id="Repeater1" runat="server" datasourceid="ObjectDataSource1">
          <ItemTemplate>
              <asp:CheckBox id="CheckBox1" runat="server" checked='<%# Bind("IsComplete") %>' /><asp:TextBox
                  id="TextBox1" runat="server" text='<%# Bind("Hash") %>'></asp:TextBox>
          </ItemTemplate>
      </asp:Repeater>
      <asp:ObjectDataSource id="ObjectDataSource1" runat="server" selectmethod="isQuestionnaireComplete"
          typename="Bll.QuestionnaireDataObject" onselecting="ObjectDataSource1_Selecting"></asp:ObjectDataSource>
      

      然后在你后面的代码中,你将需要选择方法来设置查询的参数:

      protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
      {
          e.InputParameters["strHash1"] = strHash1Value;
          e.InputParameters["strHash2"] = strHash2Value;
          e.InputParameters["strHash3"] = strHash3Value;
      }
      

      如果您再解释一下情况(所有需要显示的内容,以及所涉及的数据库逻辑),我将改进我的答案以更符合您的需求。我希望这是一个好的起点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 2010-12-18
        相关资源
        最近更新 更多