2016-04-21 46 views
4

如何創建一個可以將鍵發送到datagridview的按鈕(所以我需要以某種方式將datagridview返回到它失去焦點之前的狀態)如何創建一個按鈕,可以將鍵發送到conrol而不會失去焦點 - 虛擬鍵盤

我會解釋這個問題

我有一個DataGridView形式和一些按鈕

enter image description here

我可以按一下按鈕,就會進入相應的字母,

dataGridView1.Focus(); 
SendKeys.Send("a"); //or m or z, depending on the text of the button. 

該按鈕是爲了將數據輸入到datagridview。我可以做到這一點,所以只有在調用datagridview的enter方法時才啓用它。當點擊按鈕時,datagridview失去焦點,因此我必須在發送密鑰之前再次將焦點放在焦點上。因此,上面的兩行。

我希望用戶能夠使用按鈕將數據輸入到數據網格中。

問題是,讓我們說我想讓用戶能夠輸入文字「maz」我不能這樣做。我只得到一個人或一個或多個z。即使我可以將單元格放回可編輯模式,我也需要記住光標所在的位置。所以如果有人在單元格中鍵入asdf並將光標置於d和f之間,然後單擊m,我想要它說asdmf。

我不知道該怎麼做。

我有一個想法..也許如果有一種註冊方式,鼠標是在一個按鈕上,點擊被推動,但沒有失去對datagridview的重點,那麼這將是它可以完成的一種方式。我不知道該怎麼做,而且我對不同的方式感興趣。

+0

是否有一個原因,它必須是sendkeys而不是修改單元格內容(或底層綁定對象)? – peterG

+0

我想它可以修改單元格的內容,但仍然存在的問題是單擊該按鈕會導致失去焦點,從而失去光標位置,所以如果我想asdf成爲asdmf我看不到如何。 – barlop

回答

5

這足以讓一個不可選擇的按鈕,然後處理它的點擊事件和發送密鑰。通過這種方式,這些按鈕可以像虛擬鍵盤按鍵一樣工作,焦點將保留在具有焦點的控件上,同時將焦點發送到聚焦控件。

public class ExButton:Button 
{ 
    public ExButton() 
    { 
     SetStyle(ControlStyles.Selectable, false); 
    } 
} 

然後點擊處理事件和發送鍵:

private void exButton1_Click(object sender, EventArgs e) 
{ 
    SendKeys.SendWait("A"); 
} 

有呼籲一個ControlSetStyle不使用 繼承的方法嗎?

是的。創建此擴展方法:

public static class Extensions 
{ 
    public static void SetStyle(this Control control, ControlStyles flags, bool value) 
    { 
     Type type = control.GetType(); 
     BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance; 
     MethodInfo method = type.GetMethod("SetStyle", bindingFlags); 
     if (method != null) 
     { 
      object[] param = { flags, value }; 
      method.Invoke(control, param); 
     } 
    } 
} 

然後使用這種方式,在您的形式Load事件:

this.button1.SetStyle(ControlStyles.Selectable, false); 

然後Button1的將不繼承不可選。

+0

有沒有什麼辦法'SetStyle(ControlStyles.Selectable,false);'在一個按鈕上使它不可選擇,而不使用繼承? – barlop

+0

@barlop是的,有。我編輯了這篇文章,以便爲您提供有用的答案。 –

+0

順便說一句,因爲我找不到重複的問題**有什麼辦法可以在不使用繼承的情況下在控件上調用SetStyle嗎?**,我認爲將它作爲一個新問題提出是很好的,我會發布在那裏編輯。這樣,這個問題將會對未來的讀者更有用。 –