現在、C# でアプリケーションの検索フィルターを作成しようとしています。次のコードがあります。
loanerListBox1.Items.Clear();
string[] recordsRetreivedTemp = new string[recordsRetreived.Count];
recordsRetreived.CopyTo(recordsRetreivedTemp);
string pattern = loanerTextBox21.Text;
{
foreach (string s in recordsRetreivedTemp)
{
if (System.Text.RegularExpressions.Regex.IsMatch(s, pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
{
loanerListBox1.Items.Add(s);
}
}
}
これを行った後、私のデータテーブルが正しく満たされていないように見えることに気付きました。接続文字列は問題ありません。クエリ文字列を確認したところ、うまく構築されているようです。どこに問題があるのかわかりません。
SQL アダプター コード:
//retreive data
SqlDataAdapter adapter = new SqlDataAdapter(querystring, loanersConnection);
DataTable datatable = new DataTable();
adapter.Fill(datatable);
Items = new string[length, datatable.Rows.Count];
if (selectedTab == "LoanerItems")
{
for (int x = 0; x <= length - 1; x++)
{
for (int y = 0; y <= datatable.Rows.Count - 1; y++)
{
Items[x, y] = datatable.Rows[y][ColumnLists.LoanerItems[x]] as String;
}
}
}
エラー自体は IndexOutOrRange 例外であり、Items 配列内に値が含まれておらず、プログラムはさらにテキスト ボックスに入力するために配列を反復処理しようとします。
必要に応じて、他のコードを提供できます。今は基本的なことしか教えていません。
編集:
明確にするために。検索フィルターを使用した場合にのみ問題が発生します。使用する前は、すべて正常に動作しているように見えます。
編集2:
また、selectedTab 変数が正しく機能していることも確認しました。正しく設定されているため、問題は発生しないはずです。前述したように、クエリ文字列は適切に作成され、"SELECT * FROM table WHERE column = value" のようになります。アプリケーションはデータベースに問題なく接続しますが、検索フィルターを使用していない場合にのみデータテーブルがいっぱいになるように見えます。
データテーブルは次のように入力されていないようです:
for (int y = 0; y <= datatable.Rows.Count - 1; y++)
{
Items[x, y] = datatable.Rows[y][ColumnLists.LoanerItems[x]] as String;
}
データテーブルにゼロ行があるため、毎回スキップされます。
編集3:
SQL アダプターを使用してクラスを初期化するために使用される listbox_selectionchanged メソッド:
private void loanerListBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (loanerListBox1.SelectedItem != null)
{ //populate textboxes
string comboBoxTemp1 = loanerComboBox1.SelectedItem.ToString();
string comboBoxTempFinal = comboBoxTemp1.Replace(" ", string.Empty);
string listBoxTemp = loanerListBox1.SelectedItem.ToString();
string whereClause = string.Format("{0} = '{1}'", comboBoxTempFinal, listBoxTemp);
SQLRetrieve.PopulateColumns populatecolumns = new SQLRetrieve.PopulateColumns(whereClause, tab);
retreivedColumnsForWrite = populatecolumns.RetrieveColumns();
populateLoanerItemsPage();
//populate duplicates combobox
loanerComboBox2.Items.Clear();
for (int y = 0; y < retreivedColumnsForWrite.GetLength(1); y++)
{
if (!loanerComboBox2.IsEnabled)
{
loanerComboBox2.IsEnabled = true;
}
string tobuild = "";
//see note up top on retreivedColumnsForWrite array
for (int x = 1; x < retreivedColumnsForWrite.GetLength(0); x++)
{
tobuild += retreivedColumnsForWrite[x, y];
tobuild += "|";
}
loanerComboBox2.Items.Add(tobuild);
}
if (loanerComboBox2.Items.Count == 1)
{
loanerComboBox2.IsEnabled = false;
}
}
}
SQL アダプターを使用したクラス全体:
public class PopulateColumns
{
//Retreived columns via search query.
//X is columns, y is rows.
//Read through each x value for y row.
//Not through each y value for x row.
//for (y = 0; y < ?; y++)
//for (x = 0; x <?; x++)
private string[,] Items;
private string querystring;
private string selectedTab;
private int length;
public PopulateColumns(string passedString, string selectedTab)
{
//builds query string
querystring = string.Format("SELECT * FROM {0} WHERE {1}", selectedTab, passedString);
this.selectedTab = selectedTab;
if (selectedTab == "LoanerItems")
{
length = 30;
}
else if (selectedTab == "Customers")
{
length = 16;
}
}
public String[,] RetrieveColumns()
{
//Open Connection
SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
scsb.DataSource = "LLOYD2\\";
scsb.InitialCatalog = "LoanersTest";
scsb.IntegratedSecurity = true;
scsb.ConnectTimeout = 30;
SqlConnection loanersConnection = new SqlConnection(scsb.ConnectionString);
//retreive data
SqlDataAdapter adapter = new SqlDataAdapter(querystring, loanersConnection);
DataTable datatable = new DataTable();
adapter.Fill(datatable);
Items = new string[length, datatable.Rows.Count];
//New one needs to be added per tab.
if (selectedTab == "LoanerItems")
{
for (int x = 0; x <= length - 1; x++)
{
for (int y = 0; y <= datatable.Rows.Count - 1; y++)
{
Items[x, y] = datatable.Rows[y][ColumnLists.LoanerItems[x]] as String;
}
}
}
else if (selectedTab == "Customers")
{
for (int x = 0; x <= length - 1; x++)
{
for (int y = 0; y <= datatable.Rows.Count - 1; y++)
{
Items[x, y] = datatable.Rows[y][ColumnLists.Customers[x]] as String;
}
}
}
return Items;
}
}
詳しく調べると、textbox.clear(); のように見えます。ここでエラーを引き起こしていました:
private void loanerComboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
loanerListBox1.Items.Clear();
***loanerTextBox21.Clear();***
if (loanerComboBox1.SelectedItem != null)
{
Combox1Retrieve retriever = new Combox1Retrieve(loanerComboBox1.SelectedItem.ToString(), tab);
recordsRetreived = retriever.retrieveSQL();
for (int i = 0; i <= recordsRetreived.Count - 1; i++)
{
if (!loanerListBox1.Items.Contains(recordsRetreived[i]))
{
loanerListBox1.Items.Add(recordsRetreived[i]);
}
}
}
}