0

インターネットからコードを取得しました.TblQuestions.createdという名前のデータベーステーブルで構成され、テキストボックス名がTxtRequiredRecords&button1のDefault.aspxページが作成されました。値2をテキストボックスに入力してボタン1をクリックすると、2つの質問がランダムに生成されます.5を入力すると、テーブルから5つの質問がランダムに生成されます.オプションを入力するために別のテキストボックス2を追加したい.私の目的は、テキストボックス1に2を入力し、C textbox2. では、オプション C の質問のみからランダムに 2 つの質問が生成されます。

結果を得るためにコードのどこを変更しましたか?

私のコード Default.aspx :-

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">`
 <title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TxtRequiredRecords" runat="server"></asp:TextBox>
        <asp:Button ID="BtnDisplayRecords" runat="server" OnClick="Button1_Click" Text="Display Records" />
        <br />
        <br />
        <asp:GridView ID="GvResults" runat="server">
        </asp:GridView>
    </div>
</form>
</body>
</html>

C# コード:-

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;
public partial class _Default : System.Web.UI.Page
{
static int TotalRecords;
SqlConnection con;
SqlDataAdapter sqlda;
DataTable dt;
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        string query = "SELECT COUNT(*) AS TotalRecords FROM TblQuestions";
        DataTable dt = GetRecords(query);
        TotalRecords = Convert.ToInt32(dt.Rows[0]["TotalRecords"]);
    }

}
protected void Button1_Click(object sender, EventArgs e)
{
    bool IsInt;
    int RequiredRecords;
    string CSVData, query;
    IsInt = Int32.TryParse(TxtRequiredRecords.Text, out RequiredRecords);
    if (IsInt)
    {
        if (TotalRecords >= RequiredRecords)
        {
            CSVData = GetRandomNumbersCSV(TotalRecords, RequiredRecords);
            query = "SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY QuestionID) AS RowID,* FROM TblQuestions)TempTable WHERE RowID IN(" + CSVData + ")";
            dt = GetRecords(query);
            GvResults.DataSource = dt;
            GvResults.DataBind();
        }
        else
        {
            Response.Write("Required Records must be greater than Requried Records.");
        }
    }
    else
    {
        Response.Write("Invalid Number");
    }
}

public ArrayList RandomNumbers(int max)
{
    ArrayList lstNumbers = new ArrayList();
    Random rndNumber = new Random();
    int number = rndNumber.Next(1, max + 1);
    lstNumbers.Add(number);
    int count = 0;
    do
    {
        number = rndNumber.Next(1, max + 1);
        if (!lstNumbers.Contains(number))
        {
            lstNumbers.Add(number);
        }
        count++;
    }
    while (count <= 10 * max);
    return lstNumbers;
}

public string GetRandomNumbersCSV(int max, int req)
{
    string CSV = "";
    ArrayList lstNumbers = RandomNumbers(max);
    for (int i = 0; i < req; i++)
        CSV += lstNumbers[i].ToString() + ",";
    CSV = CSV.Remove(CSV.Length - 1);
    return CSV;
}

public DataTable GetRecords(string Query)
{
    con = GetConnection();
    con.Open();
    sqlda = new SqlDataAdapter(Query, con);
    dt = new DataTable();
    sqlda.Fill(dt);
    con.Close();
    return dt;
}

public SqlConnection GetConnection()
{
    con = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlcon"].ToString());
    return con;
}
}
4

1 に答える 1

2

通常、ID 範囲にはギャップがあり、コードは失敗します。また、重複を避けるのにも苦労しています。

これを行う正しい方法

  • テーブルから ID のリストを取得する場合、「オプション C」の条件のみを追加できます。
  • IdList をシャッフルする
  • 最初の N 要素を取る
于 2013-03-26T10:33:10.083 に答える