在Visual Studio中为db查询中的每一行生成标签和复选框

时间:2015-11-17 14:07:14

标签: c# sql asp.net database checkbox

我希望在查询中为每一行添加标签和复选框。

我需要从我的sql查询中获取记录数,但我读到SELECT语句不适用于int numberOfRecords = sqlCmd2.ExecuteNonQuery();。那么我该怎么做才能获得从我的查询中选择的记录数量(参见下面的代码)?

此代码是否足以执行从数据库生成标签和复选框所需的操作?或者我错过了什么?

备注:我不想使用Repeater Control。我已经尝试过了,因为我编写了更复杂的页面,所以它不够强大。

ASP

 <table>
        <tr>
            <td>
    <asp:Label ID="LabelFormFields" runat="server" Text="Label"></asp:Label>
            </td>
            <td>
    <asp:CheckBoxList ID="CheckBoxListFormFields" runat="server">
    </asp:CheckBoxList>
            </td>
        </tr>
    </table>

C#

 protected void Page_Load(object sender, EventArgs e)
    {
        using (SqlConnection sqlConn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["Events2"].ConnectionString))
        {
            sqlConn2.Open();

            using (SqlCommand sqlCmd2 = new SqlCommand())
            {
                sqlCmd2.Connection = sqlConn2;
                sqlCmd2.CommandType = System.Data.CommandType.Text;
                sqlCmd2.CommandText = string.Format("SELECT DisplayName FROM FormField WHERE EventId = 1 AND Visible = 0 ORDER BY ColumnOrder ASC;");
                sqlCmd2.ExecuteNonQuery();
                int numberOfRecords = //something here;
                using (SqlDataReader sqlReader = sqlCmd2.ExecuteReader())
                {
                    while (sqlReader.Read())
                    {
                        for (int i = 0; i < numberOfRecords; i++)
                        {
                            var PanelFormFields = new Panel();
                            var LabelFormFields = new Label();
                            var ListItemFormFields = new ListItem();


                            LabelFormFields.Text = sqlReader["DisplayName"].ToString();
                            CheckBoxListFormFields.Items.Add(new ListItem(sqlReader["DisplayName"].ToString(), "C"));
                            PanelFormFields.Controls.Add(LabelFormFields);
                            PanelFormFields.Controls.Add(CheckBoxListFormFields);
                        }
                    }
                }

                sqlConn2.Close();
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

int numberOfRecords = sqlCmd2.ExecuteNonQuery(); //你会得到记录号码; https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx 但是你不需要这里的数字。 你的 while(sqlReader.Read())将有助于控制循环的界限。根据您的描述,您不需要此阅读器。只需填充数据表,然后将其分配给数据网格控件。根据您要为每一行显示一个复选框,您需要创建一个自定义列。 以下是有关如何在datagrid中实现复选框和标签的好示例:http://www.codeproject.com/Articles/7629/Using-CheckBoxes-within-the-DataGrid-control-to-se

答案 1 :(得分:1)

使用DataTable.Load(IDataReader reader)方法填充DataTable,然后使用DataTable.Rows.Count获取记录数。将您的代码更改为以下内容:

[Activity (Label = "VanPac", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    static readonly List<string> Menus = new List<string>();
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);
        SetContentView (Resource.Layout.Main);

        EditText usr = FindViewById<EditText>(Resource.Id.UserName);
        EditText pwd = FindViewById<EditText>(Resource.Id.Password);
        Button button = FindViewById<Button>(Resource.Id.Login);

        button.Click += async (sender, e) => {

        if (usr.Text.Length > 0 && pwd.Text.Length > 0) 
        {
            string url = "http://myapi/api/android/validatecredentials?usr=" + usr.Text + "&pwd=" + pwd.Text;

            JsonValue json = await getDataFromDB(url);
            if(json == "200")
            {
                url = "http://54.149.94.176:82/api/android/menuslist";
                json = await getDataFromDB(url);
                var res = json.ToString();
                var t = JsonConvert.DeserializeObject<List<string>>(res);
                foreach(var i in t)
                {
                    Menus.Add(i);
                }
                var intent = new Intent(this, typeof(MenusList));
                intent.PutStringArrayListExtra("menus", Menus);
                StartActivity(intent);
            }

        }

    };

答案 2 :(得分:1)

这是一个答案。请注意,我将代码放在Page_Init而不是Page_Load中,因为Page_Load会在每次回发时重新加载,并且尚未写入数据库的任何更改都可能会消失。

    protected void Page_Init(object sender, EventArgs e)
    {
        DataTable dt = GetData();
        //int numberOfRecords = dt.Rows.Count;
        foreach (DataRow row in dt.Rows)
        {
            var PanelFormFields = new Panel();
            var LabelFormFields = new Label();
            var ListItemFormFields = new ListItem();

            LabelFormFields.Text = row[0].ToString();
            CheckBoxListFormFields.Items.Add(new ListItem(row[0].ToString(), "C"));
            PanelFormFields.Controls.Add(LabelFormFields);
            PanelFormFields.Controls.Add(CheckBoxListFormFields);
        }
    }

    private DataTable GetData()
    {
        DataTable dt = new DataTable();
        using (SqlConnection sqlConn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["Events2"].ConnectionString))
        {
            sqlConn2.Open();
            string sql = string.Format("SELECT DisplayName FROM FormField WHERE EventId = 1 AND Visible = 0 ORDER BY ColumnOrder ASC;");

            using (SqlCommand sqlCmd2 = new SqlCommand(sql, sqlConn2))
            {
                using (SqlDataAdapter da = new SqlDataAdapter(sqlCmd2))
                {
                    da.Fill(dt);
                }
            }
        }
        return dt;
    }

另请注意,我重构使用GetData()方法检索DataTable对象并简化Page_Init方法。我没有关闭sqlConn2对象,因为using块为我做了这个。我还使用了DataAdapter因为它是一种简单,快速的填充表格的方法。最后,虽然我将numberOfRecords保留在注释行中以向您展示如何获取计数,但如果您需要,则会对其进行评论,因为foreach循环不需要此值。