2

2 つの DropDownList と 1 つの ListBox があります。つまり、ddlYearLevel、ddlSubjects、および lstStudents です。

このようにコードを設定したため、ddlSubjects と lstStudents は ddlYearLevel に依存しています。

protected void ddlYearLevel_SelectedIndexChanged(object sender, EventArgs e)
{
    PopulateSubjects(int.Parse(ddlYearLevel.SelectedItem.Value));
    PopulateStudent(int.Parse(ddlSubjects.SelectedValue),
        int.Parse(ddlYearLevel.SelectedValue));
}

選択した YearLevel の Subjects の既存のレコードがある場合、問題はありません。

しかし、サブジェクトの既存のレコードがない場合、「入力文字列が正しい形式ではありませんでした」というエラーが表示されます。

私の問題は、レコードがない場合に値を null に設定するにはどうすればよいですか?

会計年度:

private void PopulateSubjects(int yearLevel)
{           
    con1.Open();
    SqlCommand com = new SqlCommand();
    com.Connection = con1;
    com.CommandType = CommandType.Text;
    com.CommandText =
        "SELECT Subjects.SubjectID, Subjects.SubjectCode, Subjects.YearID " +
        "FROM Subjects WHERE Subjects.YearID = " + yearLevel;
    SqlDataReader data = com.ExecuteReader();

    if (data != null)
    {
        ddlSubjects.DataSource = data;
        ddlSubjects.DataValueField = "SubjectID";
        ddlSubjects.DataTextField = "SubjectCode";
        ddlSubjects.DataBind();
    }
    else
        lblAdd.Text = "No records found!";

    data.Close();
    con1.Close();
    con1.Dispose();      
}
private void PopulateYearLevel()
{
    con5.Open();
    SqlCommand com = new SqlCommand();
    com.Connection = con5;
    com.CommandType = CommandType.Text;
    com.CommandText =
        "SELECT * FROM YearLevels";
        SqlDataReader data = com.ExecuteReader();
        ddlYearLevel.DataSource = data;
        ddlYearLevel.DataValueField = "YearID";
        ddlYearLevel.DataTextField = "YearLevel";
        ddlYearLevel.DataBind();

    data.Close();
    con5.Close();
    con5.Dispose();
}
4

4 に答える 4

1

int ではない値に対して Int.Parse を使用しようとしています。解析可能な値が利用できない場合は、TryParseを使用してアプリケーションのフローを変更することをお勧めします。例:

int subjectVal;
if(TryParse(ddlSubjects.SelectedValue, out subjectVal)
{
    PopulateStudent(subjectVal, yearVal);
}
else
{
    //Invalid value.  Log something, throw error, whatever.
}
于 2012-07-25T18:16:03.983 に答える
0

ddlYearLevel.SelectedIndexまた、の代わりに確認することをお勧めしますddlYearLevel.SelectedItem。これは希望どおりではない場合がありますが、SelectedIndexは現在選択されているアイテムの番号を返します。次に、それを使用して、選択したアイテムに関する情報を、調査とは別に決定できます。

于 2012-07-26T16:25:13.740 に答える
0

bool : ifをPopulateSubjects()返す必要があり、その逆も同様です。が返さ れた場合にのみ呼び出すことができます。truedata != nullPopulateStudent()true

編集:

protected void ddlYearLevel_SelectedIndexChanged(object sender, EventArgs e)
{
    if(PopulateSubjects(int.Parse(ddlYearLevel.SelectedItem.Value)))
        PopulateStudent(int.Parse(ddlSubjects.SelectedValue), int.Parse(ddlYearLevel.SelectedValue));
}  

次に、に変更private void PopulateSubjects(int yearLevel)し ます

private bool PopulateSubjects(int yearLevel)

そして、if/else ステートメントを変更して bool を追加します

bool subjectsFound;
if (data != null)
{
    ddlSubjects.DataSource = data;
    ddlSubjects.DataValueField = "SubjectID";
    ddlSubjects.DataTextField = "SubjectCode";
    ddlSubjects.DataBind();
    subjectsFound = true;
}
else
{
    lblAdd.Text = "No records found!";
    subjectsFound = false;
}

それからreturn subjectsFound;最後に。

于 2012-07-25T18:15:22.440 に答える
0

それは int.TryParse になるか!string.IsNullOrEmpty(ddlYearLevel.SelectedValue)、入力する前に単にチェックします

于 2012-07-25T18:25:04.287 に答える