none
DataGridView內的模糊搜尋及多選 RRS feed

  • 問題

  • VS 2008
    c#

    各位前輩:

    我想做像outlook通訊錄裡的搜尋功能

    例如:
    通訊錄內有一個人叫王小明
    不管在nickNameTextBox輸入的是 "王"、王小"、"王小明"
    都可以找得到

    英文的話,且不管大小寫

    下面是我目前的程式
    只能做精確搜尋

    還有當使用者一次選取全行時
    只抓得到選取的第一行及最後一行的資料
    中間的都沒有抓到
    不知要如何處理?

    謝謝各位前輩的指導 ^^

            private void searchButton1_Click(object sender, EventArgs e)
            {
                if (nickNameTextBox.Text == "")
                {
                    MessageBox.Show("未輸入暱稱");
                }
                else
                {
                    int newSelectRow;
                    for (int i = 0; i < memberDataGridView.Rows.Count; i++)
                    {
                        if (memberDataGridView.Rows[i].Cells[0].Value.ToString() == nickNameTextBox.Text)
                        {
                            newSelectRow = memberDataGridView.Rows[i].Index;
                            memberDataGridView.Rows[newSelectRow].Selected = true;
                            memberDataGridView.Rows[0].Selected = false;
                            //取得或設定顯示在 DataGridView 上的第一個資料列的索引
                            memberDataGridView.FirstDisplayedScrollingRowIndex = newSelectRow;
                            break;
                        }
                    }
                }
            }

    • 已移動 璉璉 2009年3月28日 上午 06:03
    2009年3月18日 上午 08:34

解答

  • 1.  您可以透過下列語法處理(透過Contains & ToUpper):

    private void button1_Click(object sender, EventArgs e)

            {

                if (textBox1.Text == "")

                {

                    MessageBox.Show("未輸入暱稱");

                }

                else

                {

                    int newSelectRow;

                    for (int i = 0; i < dataGridView1.Rows.Count -1 ; i++)

                    {

                        if (dataGridView1.Rows[i].Cells[1].Value.ToString().ToUpper().Contains(textBox1.Text.ToUpper()))

                        {

                            newSelectRow = dataGridView1.Rows[i].Index;

                            dataGridView1.Rows[newSelectRow].Selected = true;

                            dataGridView1.Rows[0].Selected = false;

                            //取得或設定顯示在 DataGridView 上的第一個資料列的索引

                            dataGridView1.FirstDisplayedScrollingRowIndex = newSelectRow;

                            break;

                        }

                    }

                }

     

            }



    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    • 已標示為解答 meganHsu 2009年3月20日 上午 07:48
    • 已取消標示為解答 meganHsu 2009年3月20日 上午 07:57
    • 已提議為解答 Lolota Lee 2009年3月23日 上午 02:45
    • 已標示為解答 meganHsu 2009年3月23日 上午 02:48
    2009年3月20日 上午 01:40
  • 您可以透過下列方法來做處理:

     private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

            {

                if (this.dataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0)

                {

                        // Add the selection to the clipboard.

                        Clipboard.SetDataObject(

                            this.dataGridView1.GetClipboardContent());

     

                        // Replace the text box contents with the clipboard text.

                        this.textBox1.Text = Clipboard.GetText();

                }

            }


    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    • 已提議為解答 Lolota Lee 2009年3月23日 上午 02:45
    • 已標示為解答 meganHsu 2009年3月23日 上午 02:48
    2009年3月20日 上午 09:06

所有回覆

  • 1.  您可以透過下列語法處理(透過Contains & ToUpper):

    private void button1_Click(object sender, EventArgs e)

            {

                if (textBox1.Text == "")

                {

                    MessageBox.Show("未輸入暱稱");

                }

                else

                {

                    int newSelectRow;

                    for (int i = 0; i < dataGridView1.Rows.Count -1 ; i++)

                    {

                        if (dataGridView1.Rows[i].Cells[1].Value.ToString().ToUpper().Contains(textBox1.Text.ToUpper()))

                        {

                            newSelectRow = dataGridView1.Rows[i].Index;

                            dataGridView1.Rows[newSelectRow].Selected = true;

                            dataGridView1.Rows[0].Selected = false;

                            //取得或設定顯示在 DataGridView 上的第一個資料列的索引

                            dataGridView1.FirstDisplayedScrollingRowIndex = newSelectRow;

                            break;

                        }

                    }

                }

     

            }



    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    • 已標示為解答 meganHsu 2009年3月20日 上午 07:48
    • 已取消標示為解答 meganHsu 2009年3月20日 上午 07:57
    • 已提議為解答 Lolota Lee 2009年3月23日 上午 02:45
    • 已標示為解答 meganHsu 2009年3月23日 上午 02:48
    2009年3月20日 上午 01:40
  • 感謝前輩的指導 ^^

    不知前輩是否知道
    如果在DataGridView內按shift進行多選

    例如DataGridView的內容如下
    Name    Sex
    a            m
    b            m
    c             f
    d             f
    e            m

    如果一次就選取b到d
    只有抓取到b跟d的值
    c的值會抓不到

    再次感謝前輩的指導
    2009年3月20日 上午 08:03
  • 我不知道您做了什麼處理, 我這邊測試是可以的. 複製的內容正確.


    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    2009年3月20日 上午 08:13
  • 前輩:

    我再想是否我呼叫的DataGridView事件不對
    才會造成中間的資料沒有抓到
    我是用CellContentClick事件

            private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                try
                {
                    //將其欄位內容顯示成文字供使用者編輯
                    DataGridViewTextBoxCell cname = (DataGridViewTextBoxCell)DataGridView1.Rows[rowIndex].Cells["Name"];
                    //將其欄位內容顯示成文字供使用者編輯
                    DataGridViewTextBoxCell cemail = (DataGridViewTextBoxCell)DataGridView1.Rows[rowIndex].Cells["E-Mail"];

                    //取得選取列的暱稱
                    nickname = cname.Value.ToString();
                    //取得選取列的Maill Address
                    email = cemail.Value.ToString();

                    //將暱稱存入names泛型內
                    names.Add(cname);
                    //將Maill Address存入mailaddress泛型內
                    mailaddress.Add(email);
                    TextBox1.Text = string.Join(";", names.ToArray<string>());

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

    2009年3月20日 上午 08:19
  • 您可以透過下列方法來做處理:

     private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)

            {

                if (this.dataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0)

                {

                        // Add the selection to the clipboard.

                        Clipboard.SetDataObject(

                            this.dataGridView1.GetClipboardContent());

     

                        // Replace the text box contents with the clipboard text.

                        this.textBox1.Text = Clipboard.GetText();

                }

            }


    微軟技術支援中心(CSS) - http://twitter.com/msdn_taiwan
    • 已提議為解答 Lolota Lee 2009年3月23日 上午 02:45
    • 已標示為解答 meganHsu 2009年3月23日 上午 02:48
    2009年3月20日 上午 09:06
  • 移文至:
    Windows Forms General


    T.L. Cheng
    2009年3月28日 上午 06:03