我希望在查询中为每一行添加标签和复选框。
我需要从我的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();
}
}
}
答案 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
循环不需要此值。